Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用正则表达式解析非节点、间歇的XML值_Php_Regex - Fatal编程技术网

Php 使用正则表达式解析非节点、间歇的XML值

Php 使用正则表达式解析非节点、间歇的XML值,php,regex,Php,Regex,这是regex大师的问题 如果我有一系列xml节点,我想(使用regex)解析出与当前节点在同一级别上存在的包含的节点值。例如,如果我有: <top-node> Hi <second-node> Hello <inner-node> </inner-node> </second-node> Hey <third-node>

这是regex大师的问题

如果我有一系列xml节点,我想(使用regex)解析出与当前节点在同一级别上存在的包含的节点值。例如,如果我有:

<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>");