引用不存在的子模式

时间:2013-02-07 15:25:54

标签: php regex pcre

我的正则表达式已经取得了一些进展,我正在使用伪xml标签提取属性,但后来我变得有条不紊,想要正确处理引用的属性(引号是可选的):

正则表达式

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

(这是在preg_match中用作arg的var的输出,所以'事先用'chr(92) . chr(34)创建了“明智的事物”......)

输入

kjkjkjkjkjkj{language= 'DE' /}xxxxlxlxlxlllllk
使用RegexBuddy进行测试时,

提取'DE'。但PHPs 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>";

?>

1 个答案:

答案 0 :(得分:3)

您的命名子模式格式不正确。

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

应该是

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

请参阅http://php.net/manual/en/regexp.reference.subpatterns.php