3

疑似xmlタグから属性を抽出するために使用している正規表現である程度の進歩を遂げましたが、野心的になり、引用符で囲まれた属性を正しく処理したいと考えました(引用符はオプションです):

正規表現

~\{language\s*=\s*(P?<quote>[\"\']*)(?P<att>.*?)(?P=quote)\s*/\}~

(これは preg_match で arg として使用される var の出力なので、 \" などの「意味のあるもの」はchr(92) . chr(34)事前に作成されていました...)

入力

kjkjkjkjkjkj{language= 'DE' /}xxxxlxlxlxlllllk

'DERegexBuddy でテストすると ' が抽出されます。しかし、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>";

?>
4

1 に答える 1

3

名前付きサブパターンの形式が正しくありません。

(P?<quote>[\"\']*)

する必要があります

(?P<quote>[\"\']*)

http://php.net/manual/en/regexp.reference.subpatterns.phpを参照してください。

于 2013-02-07T15:28:03.033 に答える