PHP正規表現における先読み
時折、次のようなタイプの問題を解決する必要があります:
文字列 'aaa' を見つけて '!' に置き換える、
ただし、'aaa' の直後に
'x' がある場合のみ、かつ 'x' 自体は置き換えない。
この問題を「力ずくで」解決しようとすると、うまくいきません:
<?php
preg_replace('#aaax#', '!', 'aaax'); // 結果は '!' だが、求めるのは '!x'
?>
この問題を解決するには、'x' を置き換えるべきではないと示す方法が必要です。
これは、特別な括弧 (?= ) を使用して行われます。
これらの括弧は単に「先を見る」だけで、マッチした内容として取り込みません。
これらの括弧は 肯定先読み と呼ばれます。
肯定というのは、'x'(この場合)が存在しなければならない、その場合にのみ置換が行われるためです。
この括弧を使って私たちの問題を解決してみましょう:
<?php
preg_replace('#aaa(?=x)#', '!', 'aaax'); // '!x' を返す
?>
否定先読み もあります - (?! ) - これは逆に、何かが存在してはならないことを示します。
次の例では、'aaa' の直後に 'x' が存在しない場合にのみ置換が行われます:
<?php
preg_replace('#aaa(?!x)#', '!', 'aaab'); // '!b' を返す
?>
関数名を含む文字列が与えられます:
<?php
$str = 'func1() func2() func3()';
?>
この文字列から関数名の配列を取得してください。
タグを含む文字列が与えられます:
<?php
$str = '<a href="" class="eee" id="zzz">';
?>
このタグの属性名の配列を取得してください。