2015-10-15 79 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。過濾或簡單地忽略你不需要的應該會更容易。