[PHP-users 35498] Re: ereg関数:[留学]と[嘘]の一致について

rkunihiro ryoh.kunihiro @ gmail.com
2011年 2月 20日 (日) 21:03:13 JST


クニヒロと申します。

ereg関数の戻り値の説明に
http://jp2.php.net/manual/ja/function.ereg.php
> オプションのパラメータ regs が渡されなかったり マッチした文字列の長さが 0 だったりした場合は、この関数は 1 を返します。
とありますので常に==trueになっているのではないかと思います。

本件では入力された文字列に検索文字列が含まれているかの判定のみのようですので
strposなどで十分なのではないかと思います。

if (strpos($incmnt, $ngwords[$n]) !== false) {
 print "禁止ワードあり";
 exit;
}

また、HTMLがEUCということなのでブラウザから送られてくる文字列もEUCである可能性が高いです。
禁止ワードを定義するPHPファイルの文字コードにも注意が必要です。
マルチバイト文字列関数(mb_〜で始まる関数)を利用するならmb_internal_encodingやmb_regex_encodingの設定も必要かもしれません。

以上
参考になれば幸いです。

2011年2月20日16:44 Kumiko ENOMOTO <kijibato @ nifty.com>:
> お世話になります。
>
> ブラウザ(EUCで作成されたHTML)のテキストエリアに
> ユーザーが入力した文字列について、
> PHPプログラム内で禁止ワードチェックを行っています。
>
> ereg関数を使用しているのですが、
> 「留学」と「嘘」が一致してしまいます。
> PHPプログラム内で「留学」という文字列を直接指定しても同じです。
>
> // 禁止ワード配列
> $ngwords = array("馬鹿","嘘","阿呆");
> // ブラウザ上で入力された文字列
> $incmnt = "留学";
> $cntng = count($ngwords);
> for ($n=0; $n<$cntng; $n++){
>    if (ereg($ngwords[$n], $incmnt) == true){
>      print "禁止ワードあり";
>      exit;
>    }
> }
>
> 「留」や「学」の漢字が単体だと一致せず、
> 以下のような通常の比較の場合は、
> 「留学」と「嘘」は当然一致しません。
>
> if ($ngwords[$n] == $incmnt) {
>  print "禁止ワードあり";
>  exit;
> }
>
> 何が原因と思われますか?
> ご教授のほど、よろしくお願いします。
>
>
> 榎本久美子
>
> _______________________________________________
> PHP-users mailing list  PHP-users @ php.gr.jp
> http://ml.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://oldwww.php.gr.jp/php/novice.php3
>


PHP-users メーリングリストの案内