preg_match_all跳过节点部分
问题描述:
我试图在某些数据包上运行过滤器。接收我需要的信息。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>
部分。
我怎么会意识到这一点?
答
以下是使用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。过滤或简单地忽略你不需要的应该会更容易。
为什么不只是做对了,并使用XML解析器?这是他们的目标。有一些简单的内置到PHP中。 –
因为我们收到大量的数据包,机器人的连接必须保持活力。我们必须搜索这个特定的匹配。它为机器人制作。 – d4nexaaa
无论您使用正则表达式还是xml解析器,它为什么都是“机器人”。如果它仍然是PHP,就机器人而言,不会有任何区别。 –