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。过滤或简单地忽略你不需要的东西应该更容易。
我正在尝试 运行 过滤某些数据包。收到我需要的信息。
我正在使用 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。过滤或简单地忽略你不需要的东西应该更容易。