PHP preg_match_all 找不到值

PHP preg_match_all wont find values

我一直在尝试在一个字符串中搜索两个值。我知道我必须在 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) )

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

匹配 1:312.09999999999997

第 2 场:510.75


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

将您的正则表达式更改为:

/<!\[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 )

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

$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);
$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