PHPの勉強に「10 Life-Saving PHP Snippets」で紹介されているコードを読んでみる。
■Highlight specific words in a phrase(文中の語句を強調する)
ソースコードは次のようなもの。
function highlight($sString, $aWords) {
if (!is_array ($aWords) || empty ($aWords) || !is_string ($sString)) {
return false;
}
$sWords = implode ('|', $aWords);
return preg_replace ('@\b('.$sWords.')\b@si',
'<strong style="background-color:yellow">$1</strong>',
$sString);
}
この関数では、次のような正規表現を作り、マッチした検索語句の前後にタグを挿入している。
@\b(検索語句1|検索語句2|検索語句3…)\b@si
正規表現中の「\b」は単語境界を表す。
パターン修飾子の「s」を指定すると改行を含む全ての文字にマッチする。
「i」は大小文字の違いを無視する。
したがって、この正規表現は検索語は文中の単語にマッチするが、単語の一部分にはマッチしない。
echo highlight('Highlights words in a phrase', array('word', 'phrase'));
実行結果
Highlights words in a <strong style="background-color:yellow">phrase</strong>
※文中の”words”は検索語”word”を含むがハイライトされない。
日本語は単語境界で区切られていないので、検索条件にマッチしない。
echo highlight('文中の語句を強調する', array('語', '強調'));
実行結果
文中の語句を強調する
※まったくハイライトされない
検索語句に正規表現で特別な意味を持つ文字があると、予期しない結果になる。
echo highlight('Highlights words in a phrase', array('w.*'));
実行結果
Highlights <strong style="background-color:yellow">words in a phrase</strong>
※wから始まる単語以降がハイライトされる
■一言
実際に使用するにはもう少し工夫が必要になるだろう。
Pingback: 10 Life-Saving PHP Snippetsのコードリーディングまとめ « 山本隆の開発日誌