我的正则表达式已经取得了一些进展,我正在使用伪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>";
?>
答案 0 :(得分:3)
您的命名子模式格式不正确。
(P?<quote>[\"\']*)
应该是
(?P<quote>[\"\']*)
请参阅http://php.net/manual/en/regexp.reference.subpatterns.php