
eregの代わり【PHP 5.3.x 以降】
正規表現でよく使っていた「ereg」系の関数ですが、
PHP5.3.0では非推奨となり、PHP6以降は廃止予定。
「mb_ereg」に置換えても大丈夫だと思うが、推奨されているのは「preg_match」
preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
です。
すでに当方のサーバーでは
Deprecated: Function ereg() is deprecated in・・・
なんていうエラーメッセージが出ます。
で、単純に「ereg」を「preg_match」に書き換えてもエラーになります。
これは「preg_match」の検索文字列(string $pattern のとこ)をデミリタ(/:スラッシュ)で囲む必要があるためです。
$subject = "正規関数を使う場合の注意「http://demo.s1jp.com/notes/?p=427」"; $pattern = "(https?|ftp|news)(://[[:alnum:]¥S¥+¥$¥?¥.%,!#~*/:@&=_-]+)"; ereg($pattern, $subject, $matches); print $matches[0];
$subject = "正規関数を使う場合の注意「http://demo.s1jp.com/notes/?p=427」"; $pattern = '/(https?|ftp|news)(:\/\/[[:alnum:]¥S¥+¥$¥?¥.%,!#~*\/:@&=_-]+)/'; preg_match($pattern, $subject, $matches); print $matches[0];
当然のことながら、検索文字列をデミリタで囲ったら、文字列の中に「/」が入っているとデミリタとして認識されてしまうので、エスケープシーケンスを書き加える必要があります。
× エスケープを追加してない例
”/(https?|ftp|news)(://[[:alnum:]¥S¥+¥$¥?¥.%,!#~*/:@&=_-]+)/”
○ エスケープを追加した例
”/(https?|ftp|news)(:\/\/[[:alnum:]¥S¥+¥$¥?¥.%,!#~*\/:@&=_-]+)/”
こんなもんかな・・・けっこう面倒・・・。
当方のサーバーでは、今のところ「mb_ereg」を使ってもエラーはまだ出ませんが、今後は「preg_match」を使いましょう。
おまけ
検索文字列が含まれるか確認する(最初に現れる位置を見つける)なら「strstr」関数がおすすめです。
$email = 'name@example.com'; $domain = strstr($email, '@'); echo $domain; // @example.com と表示します $user = strstr($email, '@', true); // PHP 5.3.0 以降 echo $user; // name と表示します
「strstr」は、検索文字列と検索対象の記述順が「ereg」や「preg_match」と逆なのでちょっと紛らわしいですが・・・。
コメントはお気軽にどうぞ!