3

我在使用正则表达式从伪 xml 标记中提取属性方面取得了一些进展,但后来我变得雄心勃勃,想要正确处理带引号的属性(引号是可选的):

正则表达式

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

(这是在 preg_match 中用作 arg 的 var 的输出,因此“明智的东西”,例如 \" 是chr(92) . chr(34)预先创建的......)

输入

kjkjkjkjkjkj{language= 'DE' /}xxxxlxlxlxlllllk

extracts '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>";

?>
4

1 回答 1

3

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

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

应该

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

http://php.net/manual/en/regexp.reference.subpatterns.php

于 2013-02-07T15:28:03.033 回答