我在使用正则表达式从伪 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>";
?>