Php 使用正则表达式解析非节点、间歇的XML值
这是regex大师的问题 如果我有一系列xml节点,我想(使用regex)解析出与当前节点在同一级别上存在的包含的节点值。例如,如果我有:Php 使用正则表达式解析非节点、间歇的XML值,php,regex,Php,Regex,这是regex大师的问题 如果我有一系列xml节点,我想(使用regex)解析出与当前节点在同一级别上存在的包含的节点值。例如,如果我有: <top-node> Hi <second-node> Hello <inner-node> </inner-node> </second-node> Hey <third-node>
<top-node>
Hi
<second-node>
Hello
<inner-node>
</inner-node>
</second-node>
Hey
<third-node>
Foo
</third-node>
Bar
<top-node>
我知道我可以从
$inside = preg_match('~<(\S+).*?>(?P<inside>(.|\s)*)</\1>~', $original_text);
$inside=preg_match(“~(?P(.|\s)*)~”,$original_text);
这将从顶部节点
检索文本。
然而,下一步是有点超出我的正则表达式的能力
编辑:实际上,只有当$original\u text
都在同一行时,preg\u匹配才有效。此外,我认为我可以使用一个与regex非常相似的preg_split
来检索我要查找的内容-它不能跨多行工作
注:如有任何澄清要求,本人将不胜感激;然而,我的问题非常具体,我是认真的,所以不要给出“使用SimpleXML”之类的回答。谢谢你的一切帮助 描述
此正则表达式将捕获第一级文本
(?:[\s\r\n]*\s]+)\s?(?:[^>=][^']*'.[^']*.[^']*.[^''.[^\s>]*.*)?[\s\r\n]*\K(?!\Z)(?:(?![\s\r\n]*(?:基于你自己的想法,使用preg\u-split
$raw="<top-node>
Hi
<second-node>
Hello
<inner-node>
</inner-node>
</second-node>
Hey
<third-node>
Foo
</third-node>
Bar
</top-node>";
$reg='~<(\S+).*?>(.*?)</\1>~s';
preg_match_all($reg, $raw, $res);
$res = explode(chr(31), preg_replace($reg, chr(31), $res[2][0]));
$raw=”
你好
你好
嘿
福
酒吧
";
$reg='~(.*)~s';
预匹配全部($reg、$raw、$res);
$res=爆炸(chr(31),preg_replace($reg,chr(31),$res[2][0]);
注:chr(31)是“单元分离器”
使用以下各项测试生成的阵列:
echo ("<xmp>start\n" . print_r($res, true) . "\nfin</xmp>");
echo(“开始”。打印($res,true)。“\nfin”);
这似乎适用于1个节点,为您提供了所需的数组,但它可能会有各种各样的问题。您可能希望将返回的值修剪为
编辑:
我的答案可能更好。谢谢。这是一个错误,应该是Hi。我会解决它。一些(相关)漫画释义:,哈,第一个链接让我笑得很厉害。你还在继续你的探索,还是你正在准备一个解析器?不,我不想通过利用一些额外的库来完成一个相对简单的任务。谢谢你的好答案!我几天内无法尝试这个,但我会让你知道的结果如何。这正是我在问了这个问题后得出的结论。不幸的是,我后来遇到了一个问题,如果我匹配的字符串超过了某个长度,它就不起作用了。
Hi
<second-node>
Hello
<inner-node>
</inner-node>
</second-node>
Hey
<third-node>
Foo
</third-node>
Bar
[0] => Array
(
[0] => Hi
[1] => Hey
[2] => Bar
)
[1] => Array
(
[0] =>
[1] => second-node
[2] => third-node
)
Hi
<second-node>
Hello
<second-node>
</second-node>
This string will be found
</second-node>
Hey
$raw="<top-node>
Hi
<second-node>
Hello
<inner-node>
</inner-node>
</second-node>
Hey
<third-node>
Foo
</third-node>
Bar
</top-node>";
$reg='~<(\S+).*?>(.*?)</\1>~s';
preg_match_all($reg, $raw, $res);
$res = explode(chr(31), preg_replace($reg, chr(31), $res[2][0]));
echo ("<xmp>start\n" . print_r($res, true) . "\nfin</xmp>");