疑似xmlタグから属性を抽出するために使用している正規表現である程度の進歩を遂げましたが、野心的になり、引用符で囲まれた属性を正しく処理したいと考えました(引用符はオプションです):
正規表現
~\{language\s*=\s*(P?<quote>[\"\']*)(?P<att>.*?)(?P=quote)\s*/\}~
(これは preg_match で arg として使用される var の出力なので、 \" などの「意味のあるもの」はchr(92) . chr(34)
事前に作成されていました...)
入力
kjkjkjkjkjkj{language= 'DE' /}xxxxlxlxlxlllllk
'DE
RegexBuddy でテストすると ' が抽出されます。しかし、PHP の preg_match は警告を発行します: 警告: preg_match(): コンパイルに失敗しました: オフセット 56 に存在しないサブパターンへの参照。
どうしたの?以前は「引用」が割り当てられていたと思いました...
PHPエラーがどこかにある場合に備えて、完全なプログラムを次に示します。
<?php
$QQ=chr(92) . chr(34);
$delimeters = "{}";
$del0 = preg_quote($delimeters{0});
$del1 = preg_quote($delimeters{1});
$tag="language";
$string="fdfdfdfdf{language=1}testhgg";
$preg1 = "|" . $del0 . $tag . "[^" . $del1 . "]*" . $del1 . "(.*?)" . $del0 . "/" . $tag . $del1 . "|";
$preg2 = "~" . $del0 . $tag . "\s*=\s*(?P<" . "quote>[" . $QQ . "\']*)(?P<att>.*?)(?P=quote)\s*/" . $del1 . "~";
$match=array();
preg_match($preg1,$string,$match);
echo "<br>match1:<pre>";var_dump($match);echo"</pre>";
$match=array();
preg_match($preg2,$string,$match);
echo "<br>match2:<pre>";var_dump($match);echo"</pre>";
?>