preg_match_all 跳过节点部分

preg_match_all skip node parts

我正在尝试 运行 过滤某些数据包。收到我需要的信息。


我正在使用 PHP preg_match_all 到 运行 我的过滤器并找到任何匹配项。


遗憾的是,数据包确实包含不同的节点。

<u i='550820' m='0'>
    <n>
        <![CDATA[supers0nic-]]>
    </n>
    <vars>
        <var n='state' t='s'>
        <![CDATA[0]]>
        </var>
        <var n='destinationX' t='n'>
            <![CDATA[490.75]]>
        </var>
        <var n='destinationY' t='n'>
            <![CDATA[201.5]]>
        </var>
        <var n='zchievements' t='n'>
            <![CDATA[684]]>
        </var>
    </vars>
</u>

<u i='550946' m='0'>
    <n>
        <![CDATA[cutie_lexi12]]>
    </n>
    <vars>
        <var n='destinationX' t='n'>
            <![CDATA[249.9]]>
        </var>
        <var n='destinationY' t='n'>
            <![CDATA[323.34999999999997]]>
        </var>
        <var n='zchievements' t='n'>
            <![CDATA[12731]]>
        </var>
    </vars>
</u>

这是我尝试接收的示例。重要替换为 NEEDTHIS:

<u i='NEEDTHIS' m='0'>
    <n>
        <![CDATA[NEEDTHIS]]>
    </n>
    <vars>
        <var n='state' t='s'>
        <![CDATA[0]]>
        </var>
        <var n='destinationX' t='n'>
            <![CDATA[NEEDTHIS]]>
        </var>
        <var n='destinationY' t='n'>
            <![CDATA[NEEDTHIS]]>
        </var>
        <var n='zchievements' t='n'>
            <![CDATA[684]]>
        </var>
    </vars>
</u>

遗憾的是我不得不跳过节点中的某些部分,例如以下代码:

<var n='state' t='s'>
    <![CDATA[0]]>
</var>

因为这不是每个节点都包含的。


我的实际代码:

\<u i=\'([0-9]+)\' m=\'0\'\>\<n\>\<\!\[CDATA\[([a-z0-9\-\_\s]+)\]\]\>\<\/n\>\<vars\>\<var n=\'state\' t=\'s\'\>\<\!\[CDATA\[0\]\]>\<\/var\>\<var n=\'destinationX\' t=\'n\'\>\<\!\[CDATA\[([0-9\.]+)]\]\>\<\/var\>\<var n=\'destinationY\' t=\'n\'\>\<\!\[CDATA\[([0-9\.]+)]\]\>\<\/var\>\<var n=\'zchievements\' t=\'n\'\>\<\!\[CDATA\[([0-9]+)\]\]\>\<\/var\>\<\/vars\>\<\/u\>

所以我需要跳过

<var n='state' t='s'>
    <![CDATA[0]]>
</var>

<var n='zchievements' t='n'>
    <![CDATA[684]]>
</var>

部分。


我如何实现这一点?

这是一个使用 SimpleXml 的示例。您可以以 object/tree 的方式访问已解析的 XML。

<?php
$xml = <<<'JUSTUSEXML'
<u i='550820' m='0'>
    <n>
        <![CDATA[supers0nic-]]>
    </n>
    <vars>
        <var n='state' t='s'>
        <![CDATA[0]]>
        </var>
        <var n='destinationX' t='n'>
            <![CDATA[490.75]]>
        </var>
        <var n='destinationY' t='n'>
            <![CDATA[201.5]]>
        </var>
        <var n='zchievements' t='n'>
            <![CDATA[684]]>
        </var>
    </vars>
</u>
JUSTUSEXML;

// LIBXML_NOCDATA lets you access the CDATA tags.
$nodes = new SimpleXMLElement($xml, LIBXML_NOCDATA);
print_r($nodes);

foreach ($nodes->vars as $varList) {
    foreach ($varList as $vars) {
        $var = trim($vars[0]);
        echo $var . "\n";
    }
}

乔纳森·库恩是对的。使用 XML 解析器来解析 XML。过滤或简单地忽略你不需要的东西应该更容易。