ラベル regexp の投稿を表示しています。 すべての投稿を表示
ラベル regexp の投稿を表示しています。 すべての投稿を表示

2011年9月30日金曜日

preg_match()の$は末尾に改行があってもマッチする


$は最後に改行があってもマッチする。(ただし、マッチした結果には改行は含まれない。)

preg_match('/^aaa$/', "aaa\n", $match);
echo '<pre>"', $match[0], '"</pre>';
↓
"aaa"


$の代わりに"\z"(バックスラッシュ+小文字のz)にすれば、改行があるとマッチしない。
preg_match('/^aaa\z/', "aaa\n", $match);
echo '<pre>"', $match[0], '"</pre>';
↓
""


Zが大文字だと$と同様に改行があってもマッチするので注意。
preg_match('/^aaa\Z/', "aaa\n", $match);
echo '<pre>"', $match[0], '"</pre>';
↓
"aaa"


$は改行の後ろに何かあればマッチしない。
preg_match('/^aaa$/', "aaa\n ", $match);
echo '<pre>"', $match[0], '"</pre>';
↓
""


例えそれが改行でも。
preg_match('/^aaa$/', "aaa\n\n", $match);
echo '<pre>"', $match[0], '"</pre>';
↓
""


マッチした結果に改行まで含ませるとこうなる。
preg_match('/^aaa\n\z/', "aaa\n", $match);
echo '<pre>"', $match[0], '"</pre>';
↓
"aaa
"


参考

2009年4月12日日曜日

Are you ready for PHP 5.3 ?

PHP5.3についてのIBMによる解説記事シリーズ。
冒頭の一文を並べると面白い。


最初の頃は、

第 1 回 2008年 11月 11日
PHP V5.3 は 2008年の終わりまでにリリースされる予定であり、...
第 2 回 2008年 12月 09日
この「PHP V5.3 では何が新しいのか」シリーズの記事では、2008年の末までにリリースされる予定の PHP V5.3 の、...

それが2008年末を過ぎると、
第 3 回 2009年 01月 20日
PHP V5.3 がまもなくリリースされようとしています。...
第 4 回 2009年 01月 27日
PHP V5.3 がまもなくリリースされようとしています。...
第 5 回 2009年 02月 24日
この「PHP V5.3 では何が新しいのか」シリーズでは、まもなくリリースされようとしている PHP V5.3 の、

順調に遅れたという感じか。


ここから本題。

PHP 5.3の注目機能はやはり名前空間とクロージャ。
クロージャは最低限の使用にしないとチームでの開発には支障が出そうだけど。

そして、
非推奨となった項目
PHP V5.3 から、古い関数が正式に非推奨となり、今後の PHP のバージョンでは使用できなくなります。これらの関数を使用すると E_DEPRECATED エラーが出力されます。PHP V5.3 では以下の関数が非推奨となっています。
(中略)
ereg 正規表現関数: この関数の代わりに PCRE 正規表現関数を使うことが推奨されています。PCRE 正規表現関数の方がはるかに高速であり、しかも他の言語やアプリケーションで使われている正規表現と一貫性があるからです。ereg 関数はサポートされなくなるため、PHP を 1 つの正規表現エンジンで標準化することができます。
えええ!!!これは影響がある。
preg系ってUTF-8以外のマルチバイトを完全に扱えるようになったのかな???

2009年3月5日木曜日

PHPで文字列の中から特定の文字列を探す関数の比較

PHP5での実行例。


検索対象の文字列と探したい文字列

$src = 'Sweet Apples, Pineapples and Green apples are.';
$search = 'apple';


/*** 位置を探す ***/
strrpos()はPHP4では$searchの最初の1文字のみが対象らしい。
//前から探す
var_dump(strpos($src, $search)); // -> 18
//前から探す(大文字小文字の区別なし)
var_dump(stripos($src, $search)); // -> 6
//後ろから探す
var_dump(strrpos($src, $search)); // -> 35
//後ろから探す(大文字小文字の区別なし)
var_dump(strripos($src, $search)); // -> 35


/*** それ以降の文字列を取得する ***/
strrchr()は、$searchの最初の1文字のみが対象なので注意。
strrichr()は無いようだ
//前から探す
var_dump(strstr($src, $search)); // -> 'apples and Green apples are.'
//前から探す(大文字小文字の区別なし)
var_dump(stristr($src, $search)); // -> 'Apples, Pineapples and Green apples are.'
//後ろから探す
var_dump(strrchr($src, $search)); // -> 'are.'


/*** マルチバイト対応の関数で探す ***/
文字列がマルチバイトの場合にはこちらで
//前から探す
var_dump(mb_strpos($src, $search)); // -> 18
//前から探す(大文字小文字の区別なし)
var_dump(mb_stripos($src, $search)); // -> 6
//後ろから探す
var_dump(mb_strrpos($src, $search)); // -> 35
//後ろから探す(大文字小文字の区別なし)
var_dump(mb_strripos($src, $search)); // -> 35


/*** マルチバイト対応の関数で、それ以降の文字列を取得する ***/
文字列がマルチバイトの場合にはこちらで
//前から探す
var_dump(mb_strstr($src, $search)); // -> 'apples and Green apples are.'
//前から探す(大文字小文字の区別なし)
var_dump(mb_stristr($src, $search)); // -> 'Apples, Pineapples and Green apples are.'
//後ろから探す
var_dump(mb_strrchr($src, $search)); // -> 'apples are.'
//前から探す(大文字小文字の区別なし)
var_dump(mb_strrichr($src, $search)); // -> 'apples are.'


/*** 正規表現(Perl互換)で探す ***/
戻り値はヒットした数
//最初の1つを探す
$rtn = preg_match('/' . $search . '/', $src, $matches);
var_dump($rtn); // -> 1
var_dump($matches); // -> array('apple')
//全て探す
$rtn = preg_match_all('/' . $search . '/', $src, $matches);
var_dump($rtn); // -> 2
var_dump($matches); // -> array('apple', 'apple')


/*** 正規表現(マルチバイト対応版)で探す ***/
3番目の引数を渡した場合、戻り値はヒットした文字列のバイト数
//最初の1つを探す
$rtn = mb_ereg($search, $src, $matches);
var_dump($rtn); // -> 5
var_dump($matches); // -> array('apple')
//最初の1つを探す(大文字小文字の区別なし)
$rtn = mb_eregi($search, $src, $matches);
var_dump($rtn); // -> 5
var_dump($matches); // -> array('Apple')
//先頭から一致するか調べる
var_dump(mb_ereg_match('.*' . $search, $src)); // -> true



参考:
PHP: String 関数 - Manual
PHP: マルチバイト文字列 関数 - Manual
PHP: PCRE 関数 - Manual (Perl互換正規表現関数)

2008年9月1日月曜日

Google Reader Filterで日本語のキーワードを扱う方法

Google Readerで指定したキーワードを含む記事をグレイアウトしたりハイライトしたりするGreaseMonkeyの「Google Reader Filter」。(そのまんまな名前だ。)

日本語が 使えないという指摘があるが、実際には使える。
ただし、キーワードの前後が半角スペースか先頭か末尾でないとヒットしない。
これは日本語に限った話ではないが、単語単位で半角スペースが入る英語では問題が無いため、日本語の問題に見えたのだろう。


具体的なコードの該当箇所は下記のとおり。

_getRegExp:function (items) {
 return new RegExp("(^| )("+items.join("|")+")($| )","i");
}
JavaScriptと正規表現が読める人には察しが付くだろうが、キーワードをorで繋いで、前に「先頭or半角スペース」、後ろに「末尾or半角スペース」という条件でマッチさせている。

なので、日本語をキーワードに使うには、キーワード欄に
.*あああ.* (「あああ」を含むタイトルをマッチ)
いいい.* (「いいい」で始まるタイトルをマッチ)
.*ううう (「ううう」で終わるタイトルをマッチ)
というように書けばOK。

キーワードは正規表現として使われるので、他の正規表現を埋め込んじゃってもOK。
逆に正規表現で特別な意味を持つ記号はエスケープしないと正しく動かない。


上記のような書き方が面倒な人は、GreaseMonkeyのファイルを開いて該当箇所を下記のように変更すれば「.*」の記述が不要になる。
キーワードの使い方によっては幅広くヒットしすぎて使い辛そうだが。
_getRegExp:function (items) {
 return new RegExp("("+items.join("|")+")","i");
}

ブログ アーカイブ

tags