对不存在的子模式的引用



我的正则表达式已经取得了一些进展,我正在使用它从伪xml标记中提取属性,但后来我变得模糊不清,希望正确处理带引号的属性(引号是可选的):

正则表达式

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

(这是在preg_match中用作arg的var的输出,因此"可感知的东西",如"是事先用chr(92) . chr(34)创建的…")

输入

kjkjkjkjkjkj{language= 'DE' /}xxxxlxlxlxlllllk

在RegexBuddy测试时提取'DE’。但是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>";
?>

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

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

应该是

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

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

最新更新