preg_match_all跳过节点部分

时间:2015-10-15 18:36:10

标签: php preg-match-all

我试图在某些数据包上运行过滤器。接收我需要的信息。

我使用PHP <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> 来运行我的过滤器并查找任何匹配项。

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

<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>

这是我试图接收的一个例子。重要的是被NEEDTHIS取代:

<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>

notify:true

一部分。

我怎么会意识到这一点?

1 个答案:

答案 0 :(得分:1)

以下是使用SimpleXml的示例。您可以像对象一样以对象/树形式访问已解析的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";
    }
}

Jonathan Kuhn是对的。使用XML解析器来解析XML。过滤或简单地忽略你不需要的东西应该更容易。