とりあえず正規表現の基本は分かったんで具体的に

行き当たりばったりで今まで適当に覚えた正規表現をJavaScriptを触りながら今一度、ということで。

『split』に正規表現を使う

ヒットさせる文字列『 - 』(半角空白あり)
str = 'AAA - BBB - CCC';
arrstr = str.split(/\s\-\s/);
//arrstr[0]=AAA
//arrstr[1]=BBB
//arrstr[2]=CCC


数値を区切り文字として分割する

str = 'AAA12BBB3CCC4';
arrstr = str.split(/[0-9]/g);
//arrstr[0]=AAA
//arrstr[1]=BBB
//arrstr[2]=CCC
まあこんなことも可能的なことで。


Trim的空白削除

両端の全角/半角空白を削除する。
str = "  ABC DEF  ";
Result = str.replace(/^[\s ]+|[\s ]+$/g,'');
//Result:ABC DEF


正規表現を使用して特定の文字列を探す

例:『10. xxxxxx』のような形式の文字列から先頭にある『10. 』を探す
re = new RegExp(/^[0-9]+\.\s/);
if (str.match(re)){
    ......
} 
先頭にある文字列が対象なので『^』が必要
この場合にヒットする文字列:
『0. 』、『123456789. 』など


連続した文字列を探す
  1. re= new RegExp(/[0-9]+/);
  2. re = new RegExp(/[0-9]+/g);
str = "123abc456def";           
if (str.match(re)){
    Result = RegExp.lastMatch;
}
//1. Result:123
//2. Result:456
『1.』の場合、ヒットした時点で終わりなので、『123』が返る。
『2.』の場合、『g』があるので文字列の最後まで探す、このため最後にMatchする(lastMatchだから)『456』が返る。


文字列に含まれる連続した数字を抜き出して桁数を取得する
str = "abc123456def";
re= new RegExp(/[0-9]+/);
if (str.match(re)){
    Result = RegExp.lastMatch.length;
}
//Result :6


『(),[],~~』で囲まれた文字列を削除する
str = "abc(ABC)[DEF]~GHI~()def";
Result = str.replace(/(\(|\[|~).*(\)|\]|~)/g, "");
//Result:abcdef


特定の文字列を対象に処理を行う
ヒットさせる文字列:『 - Single,- Single, - EP,- EP』
$ を使って末尾にある場合のみヒットさせる。
下記、4パターンの文字列から該当文字列を削除
  1. str = "ABCDE - Single";
  2. str = "ABCDE- Single";
  3. str = "ABCDE - EP";
  4. str = "ABCDE- EP";
Result = str.replace(/\s?-\s(EP|Single)$/, "");
//Result:ABCDE

Webページに表示する文字列の中に『"』や『'』があるとたまにバグるので、その前に『\』を付加する。
Result = str.replace(/'/g,"\\\'");
Result = str.replace(/"/g,"\\\"");
外部から情報を取得して扱うときに起こり得ることなのでここまで十分。

etc:
『.』なんでもいい1文字
『+』最低1回以上繰り返し
『*』最低0回以上繰り返し
組み合わせて
『.+』なんでもいい文字列(1文字以上)
『.*』なんでもいい文字列(1文字もなくても良い)

Keyword Search@iTunes Store:Today's Ranking

JavaScriptだけでちょっとしたコンテンツを作成してみました。
Google Feed API(以下GF API) を使用して iTunes の Feed を取得し、ランキングされたアルバム名(曲名) or アーティスト名をキーワードにGoogle Search API(以下GS API)を使用して検索をかけるというものです。

Keyword Search@iTunes Store:Today's Ranking
http://humming.bird.2k8.googlepages.com/keyword_search.itunes_store_ranking.html

ランキングされているアーチスト名を見て「誰それ?」とか、聞いたことがない曲がランキングされているのを見て「ちょっと見てみたい」「聞いてみたい」という衝動が湧いてきたりする。
これは私だけではないはず…、ということはニーズがあるかな?と思い製作開始。とりあえず形になったのでアップました。
中身(ソース)は今後ボチボチ修正していこうと考えています。

似たようなサイトは他にあるかもしれませんが、これはPHPなどを使わずにJavaScriptだけで作られているところが注目出来る点では。(自画自賛)

Usage

ページ左側のサイドバーにあるメニューから、表示するランキングを切り替えます。

表示されているランキングの『アルバム名』『曲名』もしくは『アーティスト名』をクリックするとそれをキーワードに検索します。
上図、赤い枠で囲まれた文字列が検索するキーワードになります。


Option

  • Entry - 表示するランキングの数
  • Visible -
    • [ Title Only ] - タイトルとアーティスト名のみ表示
    • [ Full ] - 全て表示
  • Country - 国の指定(指定した国のランキングを表示)

検索結果の表示

検索結果はページ右側に表示されます。
  1. ビデオ
  2. イメージ
  3. ウェブ
  4. ニュース


▽免責事項▽
該当サイトをご利用した際に起こったいかなる損害も、制作者 Y@$ 及び humming bird はその責を負いません。ご自身の責任においてご利用ください。


更新履歴

2008/09/12:
  1. jQueryを導入。slideToggleを使用してメニューとランキングの見せ方を変えた。
  2. GF APIとGS APIのデフォルトのCSSを読み込まないように修正。
    『!important』を使用しなくとも良くなったのでIE6以下のブラウザでのページの崩れをなくした。(つもり)
  3. ランキングタイトルの検索文字列の修正。
2008/09/20:
  1. IE6に対応(したつもり)

『getElementById』を使用したときのミス

JavaScriptで『getElementById』を使用してタグを拾うつもりが何故か拾えない。

コードはこんな感じ。

document.getElementById("dhy").innerHTML = pDate.getFullYear();

『dhy』というタグを取得して、そこに日付の"年"を表示させるというものだが、何処が間違っているのか分からずしばらく悩んでいた。

以下が間違いの部分。分かりやすくするために不要な部分は出来るだけハショった。
<body>
    <script type="text/javascript">set_pdate(Date());</script>
    <div id="dhy"></div>
</body>

すぐに分かった人には「なんだ」と思わせたかも知れないが、要するに、お目当てのタグ『<div id="dhy"></div>』より前にJavaScriptのFunctionを呼び出していたため、該当のタグを取得できなかったのだ。

つまり、
<body>
    <div id="dhy"></div>
    <script type="text/javascript">set_pdate(Date());</script>
</body>

このように、取得したいタグより下(すぐ下でなくとも良いのだが)でタグを取得するJavaScriptのプログラムが実行されなければならなかったのだ。
初歩的なことかもしれないが、まともに教本など読んだことがない私には勉強になった。

追記:
『window.onload』を使用すれば簡単に解決できた。

構造体のメソッド? - C#

『構造体のメソッド』などと聞き慣れない言葉に反応してみたが、実際はクラスのメソッドと見た目にはあまり変わりない書き方で追加出来てしまった。

構造体 サンプル:

public struct Human   
{  
   public float Height;  
   public float Weight;  
  
   public Human(float x, float y)  
   {  
     this.Height = x;  
     this.Weight = y;  
   }  
  
   public float BMI()  
   {  
     return (this.Weight/(this.Height*this.Height));  
   }  
}

コンストラクタのつもりで下記のように書いたのだが、
public Human(float x, float y)
しかし、
Human human = new Human();
このように、引数を指定せずに書いてもエラーにならない。

ではこのとき、構造体『Human』のフィールド『Height』『Weight』には何が入っているのか。

『human.Height』で中身を見ると、『Height』の型であるfloatの初期値『0.0』が格納されていた。つまり自動で初期値を格納する。

構造体のプロパティも可能

以下のようにプロパティも書けてしまった。
float fheight;

public float Height
{
    get { return fheight; }
    set { fheight = value; }
}

クラスとの違いは継承できないことぐらいか(例外あり)。
そうなるとクラスと構造体の違いが… ダメだ、混乱してきた。

『BeginUpdate』を使えば『AddRange』を使用した場合と処理速度は変わらない - C#

ListBoxやComboBoxにアイテムを追加する場合、追加する値を配列で持っているなら『AddRange』を使えば1発で済むのだが、そうでない場合もある。

『AddRange』に比べ『Add』メソッドを使用すると処理に時間が掛かってしまうような気になるが、処理速度にどれ程の差があるのか、実際に調べてみた。

『Add』メソッドを使用する場合、再描画に時間が掛かること、コントロールがチラつくことを回避するために『BeginUpdate,EndUpdate』を使用するものとする。

前設定として『ListBoxに文字列(Item)を追加する処理』のみを計測するため、ListBoxに追加する文字列は予め配列に持っているものとしている。

配列の要素数は100000(10万)。

AddRangeメソッドを使用した処理

lst.Items.AddRange(sArr);


Addメソッドを使用した処理
lst.BeginUpdate();
for (int i = 0 ; i < sArr.GetLength(0) ; i++)
{
    lst.Items.Add(sArr[i]);
}
lst.EndUpdate();

上記の処理を100回繰り返し、平均値を求めた。


結果:
  • 『AddRange』を使用した場合 = 753ms
  • 『Add』を使用した場合 = 756ms

3msという差は誤差の範囲と捉えられるだろう。

この結果から『BeginUpdate,EndUpdate』を使用すれば『AddRange』と『Add』は処理速度に差はない

『AddRange』の優位性は可読性のみか。

Operaは日本語でフォント指定しないとダメみたい

最近単なる興味本位で Opera を使用しているのだが、気になったことがあったのでちょっと調べた。

このブログのフォントは『メイリオ』を指定しているが Opera で表示したらメイリオにならない。最初は設定の問題かといろいろ触っていたがどうやらそうではないらしい。

どうもアルファベットでフォントを指定していることがマズイようだ。つまり、フォント指定に『Meiryo』と書いていたのだが、Operaの場合『メイリオ』と書かなければ認識しない

しかし、Safari では日本語での指定は無効になるらしい。
ということで、どちらにも対応するために日本語とアルファベットを併記するのが妥当な対処だろう。

Macユーザーはメイリオが入ってない可能性が高いので代用として、ヒラギノを指定するときにアルファベットでの指定と、Operaを使用しているMacユーザー用に日本語での指定も必要になる。

問題はXP & IE6ユーザーか。

メイリオは『Visual Studio 2008』をインストールすれば自動的にメイリオもインストールされる。
OSがVistaではなく、Visual Studioとも無縁な方はMicroSoftからダウンロード出来ますよ。


Operaの使用感

動作速度はFirefox2ぐらいなのだが、頻繁にぐるぐる(VistaのWait Cursor)が止まらない。

これがOperaのウリなのか、最初からいろいろな機能が組み込まれているのだが、使いこなさないと(覚えないと)メリットはないワケで、それがワザワザ他のブラウザから乗り換えるメリットになるのか?といった感じ。
必要な機能だけをアドオンで追加できる方が使う側にとっては混乱しなくてすむのだが。

ブラウザのデザインはイイ(私見)。


Century Gothic

Operaとは直接関係ない話ですが、このブログで使用しているもう一つのフォントである『Century Gothic』について。

個人的に好きな字体で本当はメインで使用したいのだが、たまにコードを書くので慣れないフォントが使われていると読みづらいことを実感しているのでここは控えて、サイドバーで使用しているが、これもデフォルトで入っているわけではなく、『Microsoft Office』とともにインストールされる。

こうして見ると、改めて不自由ですな。

JavaScriptの配列は摩訶不思議

JavaScriptの配列を扱うコードを書いていて、間違えて宣言した要素数より多く値を代入してしまった。しかし、何事もなく値が返されることに驚いた。なぜ?といろいろ試してみることにした。

まず、配列の要素数を宣言する。

strNum = new Array(2);//要素数を宣言する
strNum[2] = "弐";
宣言した要素数は『2』なので、以下の二つしかないはず。
  1. strNum[0]
  2. strNum[1]
つまり『strNum[2]』はない。

なので
『strNum[2] = "弐";』
の時点でコンパイル時にエラーとなる。

しかし、JavaScriptなので、そこは百歩譲ってヨシとしよう。

が、このまま『strNum[2]』を使用出来てしまうのはどういうこと?
document.write(strNum[2]);
これで『弐』と表示されるのが理解不能。

さらにもっと理解不能なのが要素数を宣言しなくても配列に代入出来てしまうこと。
strNum = new Array();//要素数を宣言しない。
strNum[2] = "弐";
こんなことも可能でしかも、
document.write(strNum[2]);
これで『弐』とちゃんと表示されるのがまたまた理解不能。

結論:
JavaScriptは配列数を宣言してもしなくても何も変わらない

こんなユルユルな仕様でイイのか?

『StringBuilder』は速い - C#

ループで何度も文字列を加えていく処理を行う場合、『+=』を使うのではなくて、『StringBuilder』クラスを使うと格段に処理が速い。VBもフレームワークは同じなのでVBユーザーも。

どれだけ処理速度に違いがあるのか、サンプルとして100000回繰り返す処理をしてみた。

サンプルコード:

static void Main(string[] args)
{
    string addWord = "abc";
    int loopCnt = 100000;
    DateTime beginTime = new DateTime();

    //::::::::::::::::::::::::::::::::::::::::::::::::::::://

    StringBuilder tmpSB = new StringBuilder();

    beginTime = DateTime.Now;

    for (int i = 0; i < loopCnt ; i++)
    {
        tmpSB.Append(addWord);
    }
    Console.WriteLine("StringBuilderを使用した場合:" + (DateTime.Now - beginTime).TotalMilliseconds + "ms");

    //::::::::::::::::::::::::::::::::::::::::::::::::::::://

    string tmp = "";

    beginTime = DateTime.Now;

    for (int i = 0; i < loopCnt; i++)
    {
        tmp += addWord;
    }
    Console.WriteLine("+= で処理した場合:" + (DateTime.Now - beginTime).TotalMilliseconds +"ms");
}


結果)
  • StringBuilderを使用した場合:6ms
  • += で処理した場合:19700ms


上記では加えていく文字列は3文字だが、これを倍の6文字にすると結果は
  • StringBuilderを使用した場合:6ms
  • += で処理した場合:50290ms

StringBuilderでの処理時間に差はないが、+=はやはり加える文字列の長さが処理時間に影響するようだ。


参考)PCスペック
OS: Win Vista
CPU: Core 2 Duo 2.66GHz

これだけ違うなら使う気にもなるだろう。
でも、実際はこんなに文字列を加える処理ってあまり行う機会はないんですけど…

急上昇検索ワード & etc フィード一覧

『Google Feed API』のサンプルを作成する際に、取得するフィードをあちこち探していたときに蓄えたものを整理も兼ねてここに挙げておきます。


急上昇ワードランキングのフィード

Yahoo - 急上昇ワードランキング
さすが大手というべきか、実際にフィードを見ると、どんな情報を知るためにそのワードで検索されているのかが分かるような内容となっている。
http://searchranking.yahoo.co.jp/burst_ranking/


BIGLOBEサーチ
急上昇ワードランキングのフィードは過去1週間の統計しか取得できないし、フィードの内容にも不満。
http://search.biglobe.ne.jp/ranking/


goo - キーワードランキング
独自に算出したポイントでランキングされている。他にも様々(独自のアンケート結果など)なランキングのフィードを取得できるようだ。
http://ranking.goo.ne.jp/keyword/


excite - トレンドトラッカー
『話題の人』『話題のゲーム』などといったカテゴリー別にランキングされている。フィードもそのカテゴリー別に取得できる。
http://tt.excite.co.jp/


[nifty - 瞬!ワード]
RSSフィードは一応あるのだが内容は良く言えば質素です。
http://www.nifty.com/shun/ranking.htm


YouTube - トレンド
YouTubeでもを配信していた。20位までの急上昇ワード、『上昇』『下降』『新規』という情報まで分かる。
http://jp.youtube.com/hottrends


その他のサイト:
MSN(Windows Liveも含めて)は(苦笑いしか…)、フィードの有無以前にこの手の情報は一切ない。
Googleは探してもこれくらいしか出てこなかった。相変わらず自身の情報は出さないようですね。

オリコンのランキングを取得できないかと調べたがダメでした。オリコンのサイトで配布している単体アプリ『ORICONティッカー』とやらでなら閲覧出来るようだ。今どきガジェットでもない単体アプリを使用させるとは如何なものか。




ポータルサイト、SBMサービスのフィード一覧


[Google - News]
Googleが公にフィードを公開しているのはここぐらいでした。

RSS and Atom Feeds : Terms of Use - Google News Help

これによると、日本のニュースのフィードはまだサポートしていないということですが、『話題のニュース』だけはフィードを取得出来ました。いろいろ試したのですが、例えばトップニュースに関しては『topic=h』では取得出来ないようです。


Yahoo - News
ニュースフィードの種類も充実。お好みでどぞ。
http://public.news.yahoo.co.jp/rss/



はてな - 最近の人気エントリー
はてなのエントリーの場合、RSSリーダーを使わずともガジェットからこれをチェックしている人は多いだろう。
http://b.hatena.ne.jp/hotentry

その他にも、下記にその一部を挙げたが様々なフィードを提供している。


newsing
サクッと見つかったんで挙げときます。
http://newsing.jp/about/feedlist


イザ!
特に…
http://www.iza.ne.jp/help/rss.html


livedoor - 注目度ランキング
注目度ランキングの他、おすすめフィードなどをOPMLで提供。
http://reader.livedoor.com/ranking/hot.html


livedoor - RSS一覧
livedoorのフィードはこちらからの方が早いか。
http://docs.livedoor.com/rss/


Digg RSS Feeds
http://digg.com/about-rss


delicious - Recent Bookmarks
フィード登録ボタンはページ左下にあるのだが、『Recent』のリンクを押すたびに内容が変わる仕組みになっているのが意味不明。
http://delicious.com/recent/;_ylt=A0wNBqDgiqJItnYB15FVRh54;_ylv=3

delicious - Popular Bookmarks
トップページ左下にフィード登録ボタン有り
http://delicious.com/


Tecchnorati - 人気のキーワード
トップページのやや左上辺りに「人気のキーワード」のフィード登録ボタンがある。下の画像でも確認できるがメニューらしき「エンタメ」「テクノロジー」「経済・社会」「スポーツ」といったボタンを押すとフィードを取得できる。(この作りには正直参った。どう見てもメニューにしか見えない)
http://feeds.technorati.jp/


[YouTube]
ここから「おすすめ」「話題の動画」「新着動画」などのフィードを登録できる。
http://jp.youtube.com/browse?s=rf&c=0&l=&b=0


iTunes Store RSS Feed Generator
これはイイ。みんな真似すればイイのに。
http://phobos.apple.com/WebObjects/MZStoreServices.woa/wa/MRSS/rssGenerator

Geegle Feed API のサンプルをいくつか作ってみた

Google Feed APIによってクロスドメインの制限がなくなり、様々なフィードを取得し表示できるようになりましたが、そのメリットを今一つ活用し切れていないように感じられる。
他サイトのフィードを商用目的に利用する、または一つのコンテンツとすることについてはいろいろと制限があるかもしれないが、「JavaScriptだけでここまで出来るようになった」ということを明確(視覚的な意味で)に示したいということで、いろいろとサンプルを作ってみた。

『iTunes Store』のフィードを表示してみる

『Sample #1』ではページのソースを見てもらえば分かりますが、ほんの数行のJavaScriptだけで作られています。

取得しているフィード:
  1. Today’s トップ10ソングス
  2. Today’s トップ 10 アルバム
  3. Today's 10 最新リリース

『Sample #2』は見た目は 『Sample #1』に似ていますが、要素を一つ一つ取得して表示しています。カバー画像は小さめの画像にしたり、ジャンルや合計曲数は取得しなかったり と、名前空間URIが分かれば表示したいものだけをチョイスし、表示したい場所に出力することも可能です。

『Sample #3』ではTop100のアルバムのカバーだけを取得して表示しています。
アンカーの「title」に各エントリーのタイトルを取得して、カバー画像の上にマウスを置いたときに表示されるようにしています。
※Sample #3はIEだとページが崩れます。

『YouTube』のフィードを表示してみる

これも単純に取得表示したものです。

次は二つのフィードを比べてみた。

どちらも再生回数の多い動画 (本日分)のフィード(のはず)だが、内容が少々異なるのは良く分からないが、コンテンツ自体の違いがあるのが分かる。これを取得、表示し見比べると分かりやすい。

フィードの種類も同じRSS2.0ことから見ても、なぜに異なるフィードが存在するのか不思議。

おまけ

Google Feed APIには『google.feeds.FeedControl クラス』というものもあり、この『Feed Control』を使用しても複数のフィードを表示することが可能。

Google Search APIやjQueryと組み合わせたりすることでもっと面白いコンテンツになりそうな素材ではないかと。

Excelで簡単に分数を入力する

Excelで分数を入力する場合は、[書式設定] - [表示形式]にて『分数』を選択する、と覚えている方もいらっしゃるかも知れませんが、イチイチ表示形式を変更しなくても分数を表示させる方法を紹介。

例えばセルに『2/3』と表示させたいのであれば、『0 2/3』と入力するだけです。これで『2/3』と表示されます。

『0[半角空白]』は整数値を表しています。算数で学んだ整数と分数を分けて表示しているのです。

Excelの分数のフォーマットが『# ?/?』のような形式で、これに沿った形で入力することにより分数と判断してくれるということです。

入力したセルの表示形式を確認してもらえば分かりますが、表示形式が自動的に『分数』となっているはずです。

Excelの他の表示形式フォーマットの例を挙げると、『\1000』と入力すると『\1,000』と表示され、表示形式が自動的に『通貨』となっているはずです。

『2 5/3』と入力するとどうなるか。自動的に分数を整数に直して『3 2/3』と表示します。

VBの『Exit Sub』とはC#で言うところの何?

VB出身の私はそれ以降の処理を行わない時に『Exit Sub』をよく使っていたのだが、C#では何だろうとヘルプを探しまくったが見つからないのでググったら何のことはない。『return』で良いのだ。

『return』は"値を返す"という固定観念が発想を邪魔していた。

例)

namespace returnの用途{
  class Program{
    static void Main(string[] args) {
      return;
      Console.WriteLine("returnがなければ表示される文字列");
    }
  }
}

このコードを実行すると当然何も起こらない。

『return』のところで『Main』の処理が終了するので、赤く記したコードが実行されないのだ。
『return』の部分をコメントアウトすると下図のように表示される。

image
Result

『lightBox 0.5』から『Highlside JS』に変えた訳

以前、このブログでは画像閲覧用に『lightBox 0.5』を使用していたが、現在は『Highslide』を使用している。
その理由について、『lightBox 0.5』のバグ報告も兼ねて。

本当にそうなるのか実際に試したい場合は以下にサンプルがあるのでこれで試してみると良い。
http://humming.bird.2k8.googlepages.com/lightBox05Sample.html


[Enter] キーを押すと重ねて表示される

『lightBox 0.5』の動作はWebページに表示されているサムネイルをクリックするとリンクされた画像をレイヤーを上から重ねたように表示するが、その状態で[Enter]キーを押すとまたその上にレイヤーを重ねるように表示してしまう。通常画像以外の背景は50%程度透過している(透過値は設定で変更可能)が、[Enter]キーを押し続ければこんなことになる。

lightbox05_bug_1

画像表示中は[Enter]キーを無効にするか、もしくは画像表示中に[Enter]キーを押された場合は画像を閉じるといった制御にすべきと考える。

IE7でのバグ

IE7では画像表示中に[Enter]キーを押すとこのようになる。

lightbox05_bug_2


こうなるとページを再描画するしかない。これは致命的。

[Esc]キーを押しても無反応

『lightBox 0.5』自体キー操作は一切対応していない、というわけでもなく『←,→』キーで画像が切り替わる。ならば[Esc]キーを押した時は画像を閉じるという動作がなぜ実装されないのか不思議。ちなみに『Highslide JS』では[Esc]キーを押すと画像が閉じる。


jsファイルが読み込まれる前に画像を表示しようとすると画像をローカルに保存してしまう

完全にlightBox.jsファイルが読み込まれていない状態、Webページが描画されてすぐに画像のサムネイルをクリックし、画像を表示させようとすると該当の画像ファイルをローカルに保存してしまうのだ。通常考えられるのはスクリプトを無効にした状態と同じ動作、例えば別ページで該当の画像のみを表示するような動作なら理解できるがダウンロードしてしまうのは頂けない。

比較対象として『Lightbox 2』の動作を確認

Lightbox 2』ではこのような動作はないようだ。[Esc]キーを押せば画像は閉じられるし、[Enter]キーを押せば画像を再描画するという動作で「これはこういう仕様」という範囲。ちょっと触った程度だがIE7でもちゃんと動作した。

結論:
完全にチョイスミス…
ライトボックスを使用するなら『Lightbox 2』を使用するべし。
しかし、『Highslide JS』の方が表示した画像をドラッグして移動できるなど、閲覧者側にとっての自由度が高い分、こちらの方が良いかも、ということで『Highslide』をチョイスした。

『preg_match』の何たらかんたら

PHPで文字列チェックしたくてちょっと調べた。

こんな感じでOK?みたいなものが以下のコード。

<?php
function chk_alnum($text) { 
  if (preg_match("/^[a-zA-Z0-9]+$/",$text)) { 
    return TRUE; 
  } else { 
    return FALSE; 
  } 
}
?>
いろいろ出てきた情報を整理。


『preg_match』 — 正規表現によるマッチングを行う

ヒント:
ある文字列が他の文字列内に含まれているかどうかを調べるためだけに
preg_match() を使うのは避けた方が良いでしょう。
strpos() か strstr() 関数を 使う方が速くなります。
だってさ。

preg_match("/パターン/", 調べる文字列);

  • "/パターン/"        //文字列の1行目のみを調べる
  • "/パターン/s"   //改行文字を無視し、1行とみなして調べる
  • "/パターン/i"       //文字列の大文字・小文字を区別しない
  • "/パターン/is"      //大文字・小文字を区別せず、1行とみなして調べる

『"/パターン/g"』は「複数行を調べる」という記述を発見したが、これは実際にはエラーになるらしい。
g修飾子を使うためには『preg_match_all』を使わなければならないそうだ。

『preg_match』 は、pattern がマッチした回数を返す。
つまり、0回(マッチせず)または 1回となる。
これは、最初にマッチした時点で『preg_match』は検索を止めるため。
逆に『preg_match_all()』は、subject の終わりまで検索を続けます。
『preg_match』 は、エラーが発生した場合にFALSEを返します。


補足:
PHPのマニュアルでこんなことが書かれていた。
注意: Perl 互換の正規表現構文を使用する preg_match() のほうが、
多くの場合 ereg() よりも速く動作します。

へ~  …で、『PHPのpregは本当にeregより速いのか』で実際に調べていた。
そこでは『ereg_replace』と『preg_replace』で比較していたのだが、結果は『preg』の方が4倍近く高速だったそうな。
逆に『ereg』のメリットは何ぞや?単なる古いものとの互換性のためだけに残してあるものだったりするのだろうか?

また宿題できちゃったよ。

Sony Style(ソニースタイル)
デル株式会社

Recent Posts