PHPエラー「Warning: preg_match_all() [function.preg-match-all]: Unknown modifier」の原因と解決方法

以下のようなエラーが表示されることがある。
Warning: preg_match_all() [function.preg-match-all]: Unknown modifier 'a' in C:\php\nobuneko\test.php line 24
これは、関数「preg-match-all」で不明な修飾子「a」が使われている、という意味。関数preg-match-allで「修飾子」をつける場所といったら「/(スラッシュ)」の隣なので、「/(スラッシュ)」の記述箇所を探す。

《間違いの例》
$html_source =<<<CAT
<a href="noraneko.html">野良猫A</a><br />
飼い猫A<br />
飼い猫B<br />
<a href="noraneko2.html">野良猫B</a><br />
<a href="noraneko3.html">野良猫C</a><br />
<a href="noraneko4.html">野良猫D</a><br />
CAT;

$num = preg_match_all("/<a href=\"[^<]+\">.+?</a>/",$html_source,$array_match);
echo $num;
echo "<br>\n";
print_r($array_match);

上記の例の場合、正規表現の開始位置と終了位置を示す「/(スラッシュ)」の他に正規表現内に「/(スラッシュ)」がそのまま含まれていたことが原因だった。例の場合、</a>の「/(スラッシュ)」の直前にエスケープ文字「\」(Windowsだと半角の¥マーク、Linuxだとバックスラッシュ)を付けることで解決できる。

<誤>「$num = preg_match_all("/<a href=\"[^<]+\">.+?</a>/",$html_source,$array_match);」
<正>「$num = preg_match_all("/<a href=\"[^<]+\">.+?<\/a>/",$html_source,$array_match);」

preg_match_allの構文は、以下の通り。
preg_match_all(パターン文字列,検索対象の文字列,結果を格納する配列)
・パターン文字列→正規表現でマッチさせたい文字列のパターンを記述する
・検索対象の文字列→HTMLソース、テキストソースなど、検索対象となるソースを指定する(ereg系の関数と違って、「/(スラッシュ)」で正規表現全体を囲む必要があるので注意)
・結果を格納する配列→検索対象の文字列の中でパターン文字列にマッチした文字列を格納する配列
※preg_match_all(パターン文字列,検索対象の文字列,結果を格納する配列)の戻り値(返り値)は、パターンマッチした数となる。

《正しい例》HTMLソースの中のリンクをHTMLタグ付で取得することを想定。
$html_source =<<<CAT
<a href="noraneko.html">野良猫A</a><br />
飼い猫A<br />
飼い猫B<br />
<a href="noraneko2.html">野良猫B</a><br />
<a href="noraneko3.html">野良猫C</a><br />
<a href="noraneko4.html">野良猫D</a><br />
CAT;

$num = preg_match_all("/<a href=\"[^<]+\">.+?<\/a>/",$html_source,$array_match);
echo $num;
echo "<br>\n";
print_r($array_match);

《上記の例の実行結果》
4<br>
Array
(
[0] => Array
(
[0] => <a href="noraneko.html">野良猫A</a>
[1] => <a href="noraneko2.html">野良猫B</a>
[2] => <a href="noraneko3.html">野良猫C</a>
[3] => <a href="noraneko4.html">野良猫D</a>
)

)

前へ

PHPエラー「Parse error: parse error, unexpected T_START_HEREDOC」の原因と解決方法

次へ

PHPエラー「Fatal error: Call to undefined function mb_convert_encoding()」の原因と解決方法(Windows用PHP)