PHP preg_match_all不会找到值

时间:2015-10-12 20:19:28

标签: php xml-parsing preg-match-all

我一直试着在字符串中搜索两个值。我知道我必须在PHP中使用以下命令:

preg_match_all

它也必须被逃脱。所以我试图为此创建一个过滤器。

原始代码:

<![CDATA[312.09999999999997]]></var><var n='destinationX' t='n'><![CDATA[510.75]]>

我的实际代码:

if (preg_match_all("\<!\[CDATA\[([0-9a-z_-]+)\]\]\>\</var\>\<var n=\'destinationY\' t=\'n\'\>\<\!\[CDATA\[([0-9a-z_-]+)\]\]/i>", $packets, $matches) )

可悲的是,它不会返回CDATA中包含的数据。所以我试图从这个字符串中获取以下信息:

比赛1:312.09999999999997

比赛2:510.75

有没有人知道我做错了什么?

3 个答案:

答案 0 :(得分:2)

将正则表达式更改为:

/<!\[CDATA\[([0-9a-z_\-.]+)\]\]>/

你需要转义一个字面连字符,或者正则表达式引擎会假设它正在寻找一个范围(比如0-9或a-z)并且你不允许使用句号。

我使用您提供的字符串将其放入快速测试脚本中:

<?php

$matches;
$packets = "<![CDATA[312.09999999999997]]></var><var n='destinationX' t='n'><![CDATA[510.75]]>";
preg_match_all('/<!\[CDATA\[([0-9a-z_\-.]+)\]\]>/i', $packets, $matches);
$matches = $matches[1];
print_r($matches);

这给了我这样的输出:

Array ( [0] => 312.09999999999997 [1] => 510.75 )

答案 1 :(得分:2)

$myString = "<![CDATA[312.09999999999997]]></var><var n='destinationX' t='n'><![CDATA[510.75]]>";
preg_match_all('/CDATA\[([a-z0-9-\.]+)\]/i', $myString, $matches, PREG_PATTERN_ORDER);
print_r($matches[1]);

<强>输出

Array
(
    [0] => 312.09999999999997
    [1] => 510.75
)

现场演示

http://ideone.com/C3a7Ci

答案 2 :(得分:0)

这应该得到介于两者之间的值;

$packets = "<![CDATA[312.09999999999997]]></var><var n='destinationX' t='n'><![CDATA[510.75]]>";
$regex = "~[0-9]+\.[0-9]+~";
preg_match_all($regex, $packets, $matches);

print_r($matches);