2015-10-15 95 views
0

我试图在某些数据包上运行过滤器。接收我需要的信息。preg_match_all跳过节点部分


我使用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> 

这里是什么IM欲接收的例子。重要的是替换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> 

部分。


我怎么会意识到这一点?

+0

为什么不只是做对了,并使用XML解析器?这是他们的目标。有一些简单的内置到PHP中。 –

+0

因为我们收到大量的数据包,机器人的连接必须保持活力。我们必须搜索这个特定的匹配。它为机器人制作。 – d4nexaaa

+0

无论您使用正则表达式还是xml解析器,它为什么都是“机器人”。如果它仍然是PHP,就机器人而言,不会有任何区别。 –

回答

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

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