• 締切済み

【PHP】「ereg_match」はなぜ不人気なのか?

PHP初心者です。 現在ファイルの中を英語や日本語で検索するプログラムを作っています。 検索といえば「preg_match」が一番人気あるように見えます。しかしたとえば、 mb_internal_encoding("UTF-8"); mb_regex_encoding("UTF-8"); if(preg_match( '/我輩は.である/' ,'我輩は猫である')){ print "マッチ!"; } 上記のような使い方をすると「.」は「猫」にマッチせず「...」にするとようやくマッチします。「preg_match」はマルチバイトに対応していないのでしょうか。 そこでマルチバイトと正規表現に対応した検索関数「mb_ereg_match」を知りました。 if(mb_ereg_match( '我輩は.である' ,'我輩は猫である')){ これなら正常にマッチします。 がしかし… 「mb_ereg_match」は全然辞書に載ってません。分厚いPHP辞書をいくつも持ってますが「ereg_match」すら載ってません。何か不人気の理由があるのでしょうか?気に入ったのに不安で使えません。 お詳しい方、解説よろしくお願いいたします。

  • PHP
  • 回答数2
  • ありがとう数2

みんなの回答

回答No.2

#1です。 > uをつけたとたんエラーになってしまいだめでした わたしも最初エラーが出たんです(笑。 phpのファイルの文字コードは何ですか? ファイル自体がUTFで書いてないとエラーが出ますね。 多分バージョンは関係ないと思います。

takosuke88
質問者

お礼

ファイル自体の文字コードはもちろんUTF-8です。 念のためテラパッドで確認しましたが間違いなかったです。 困ったなあ…

回答No.1

マルチバイトの正規表現は癖がありますよね。 preg_matchでも検索出来ますよ。オプションuを付けるのです。 if(preg_match( '/我輩は.である/u' ,'我輩は猫である')){ print "マッチ!"; } この辺にも参考になる情報がありました。 http://ifs.seesaa.net/article/26300967.html

takosuke88
質問者

お礼

なるほど! ど思ったんですが、「u」をつけたとたんエラーになってしまいだめでした…念のためまるごとコピペもしたんですが同じでした。 どうすれば… *当方のバージョンは4.4.4です。

関連するQ&A

  • ereg_match関数について

    こんばんは。PHP初めて間もないド素人です。とあるサイトを参考に、バイナリセーフ関数とかいうのととそうでない関数の処理の違いを検証してみようと思い、以下のコードを試してみました。 <?php //preg_match関数がバイナリセーフ関数である事を検証する。 //正規表現文字列にマッチしない文字があれば1を返す。 $kekka=preg_match('/[^a-zA-Z0-9_]/','oh_my_god\x00@'); $kekka2=ereg_match('/[^a-zA-Z0-9_]/','oh_my_god\x00@'); print($kekka); print("<br/>"); print($kekka2); ?> <!--<html>タグがないのにいきなり<br/> とか打っても大丈夫か試してみる。 print_rと打ってみたらなにか変わるか試してみる。--> <br/> <?php print_r($kekka); ?> これを試した結果、 Fatal error: Call to undefined function ereg_match() ...... というエラーがでました。ereg_match関数についてインターネットで 調べてみたのですがヒット率が異常に悪く「もしかしてpreg_match?」 とか表示されたりもしました。今php5を使ってますが、もしかして この関数はもうなくなった関数なのでしょうか?

    • ベストアンサー
    • PHP
  • 【PHP】ereg() で文字種判定するときエラーになる

    PHP5使用者です。 ereg() でよくわからないエラーに直面して悩んでおります。 例えば、サンプル文字列が半角数字a~z又は -(ハイフン)のみで構成されているか調べたい場合、以下の方法を試しました。 1)if( ereg("^[\-a-z]+$", $str )){ 2)if( ereg("^[a-z-]+$", $str )){ 3)if( mb_ereg("^[\-a-z]+$", $str )){ 4)if( preg_match("/^[\-a-z]+$/", $str )){ 但し $str はシングルバイト文字です 結果、1)のみエラーになります。-をエスケープしているのになぜでしょうか? 文字コードはShift_JIS、EUC-JP、UTF-8とも試しましたが同じでした。そもそも常にマルチバイト関数を使うべきとか…? 解説していただける方、よろしくお願いいたします。

    • 締切済み
    • PHP
  • preg_match・ereg_replaceの動作について

    preg_matchとereg_matchの動作について調べています。 下記のスクリプトを実行すると、$stringが「代入テスト」となります。 ------------------------------------------- $v_insert = "代入" $string = "{%v_insert}テスト"; while (preg_match("/\{%(.*)\}/U", $string, $match)){ $string = ereg_replace($match[0], $$match[1], $a_subject); } ------------------------------------------- $$match[1]→$($match[1])→$(v_insert)となり、 $match[0]→/\{%(.*)\}/U $match[1]→v_insert $$match[1]→代入 となるのは分かったんですが、なぜ、$match[0]→/\{%(.*)\}/Uで$match[1]がv_insertになるのかが分かりません。 このスクリプトはどのように動き、どのように変数に値が設定されているのでしょうか。

    • ベストアンサー
    • PHP
  • POSIX系(ereg)とPerl互換系(preg_match)、PHPの実務で多用されるのはどっち?

    PHPの実務の現場で、好んで使用される正規表現関数は、 POSIX互換かPerl互換かどちらでしょうか? 場合によりけりでしょうか? それとも、Perlを知らないプログラマーは、ereg や ereg_replace しか使っていなかったり、 逆に、機能が豊富な preg_match や preg_replace の方が好まれるのでしょうか? 今後、PHPプログラマーと共同で開発することを考えれば、どちらを使用すればいいでしょうか? ※POSIX互換では、数字の \d って使えないんですか?

    • ベストアンサー
    • PHP
  • PHPのeregとereg_replaceの細かい使い方がわかりません。

    PHPのソースの解読をしているのですが、聞く人が今いないために質問させてください。 マニュアルを見たところ、eregは検索、ereg_replaceは置換ということはわかったのですが、以下の文はどのような意味になるのでしょうか。お願いします。 if ( strlen ( $dat ) > 0 ) { $dat = ereg_replace ( "\/\/.*", "", $dat ); if ( ereg ( '^\[.*\]', $dat ) ) { $idx = trim ( $dat, "[] " ); } }

    • ベストアンサー
    • PHP
  • mb_eregを使っての文字列検索、抽出について

    パターン="関数.+ます。" 上記パターンで、"関数"から"ます。"までを含む文字列を抽出する事は出来ました。が、 一番最初に出てくる"ます。"で検索をストップし、変数$matchに代入する事はできますか? (指定したキーワード"関数"以降の全ての"ます。"が変数に代入されてしまいます、最初に出てくる"ます。"まで抽出できれば充分なので。) キーワードやアドバイスがあればお教え下さい。 宜しくお願いします。 以下のプログラムで実行しました。 <?php //mb_eregについて $url="http://jp2.php.net/mb_ereg"; //アドレス指定 $result=file_get_contents($url);//取得 $text_contents=strip_tags($result);//タグを外す $sjis_text=mb_convert_encoding($text_contents,"SJIS","auto");//sjisに変換 echo("$sjis_text<br>");//本文出力 echo("----------------------------------------------<br>"); if(mb_ereg("関数.+ます。",$sjis_text,$match))//"関数"から"ます。"まで検索 echo("$match[0]<br>");//検索結果表示 ?>

    • ベストアンサー
    • PHP
  • mb_ereg_matchのつかいかたについて

    PHP Version 4.3.11 windows2000 を使っています。 mb_ereg_matchのつかいかたなのですが、 $s1="100"; $pattarn="/100/"; var_dump (mb_ereg_match("/$pattarn/", $s1)); とすると bool(false) となります。実際値に入るのは日本語なのですが、数字ですらできないので何か間違っているならば教えてください。お願いします。

    • ベストアンサー
    • PHP
  • 【PHP】半角「\」を全角「¥」に変換したい

    PHP初心者です。 バージョンは4.4.4 ファーストサーバ 文字コードはUTF-8 です。 マルチバイト文字の中の半角「\」をそれ以外の文字に変換したいのですがどうすればできるでしょうか? (1)$str = mb_ereg_replace("\\", '¥', $str); (2)$str = preg_replace("\\", '¥', $str); (1)も(2)もエラーとなり変換できません。 お詳しい方、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPで文字を検索して取り込みたい。

    PHPで文字を検索して取り込みたい。 %の文字が、何度か出現するソースなのですが そのソースの中にある50%のような全角で%の数値を 取り込みたいのです。 //////ソース//////// <table> <TR> <TD>あ</TD> <TD><B>88%</B>/TD> </TR> <TR> <TD>す</TD> <TD><B>85%</B>/TD> </TR> ........... </table> /////////////////////// 下記のように実行しましたが 思うような結果は得られません。 <?php $str = file_get_contents('http://123456/index.html'); if (preg_match('!<table>\s*?(.*?)</table>!s', $str, $res)) $text = mb_convert_encoding($res[1],"shift-jis","UTF-8");preg_match_all("/-*[0-9]+/",str_replace(",","",$text),$matches); print ($matches[0][0]); ////////////////////////////// php初心者です。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPの正規表現「preg_match」で漢字を含む場合のマッチパター

    PHPの正規表現「preg_match」で漢字を含む場合のマッチパターンについて 宜しくお願い致します。 preg_matchを使っての正規表現で、「あいうえおかきくけこ3月10日さしすせそ」という文字列から「3月10日」だけを抽出するには、どういうパターンが良いのでしょうか? 下記の様にやってみましたが、だめでした。。。 preg_match("/\d{1,2}[月]\d{1,2}[日]/",$hoge,$match) これではうまくいきません。 どなたかお助けくださいー!

    • ベストアンサー
    • PHP