我一直试着在字符串中搜索两个值。我知道我必须在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
有没有人知道我做错了什么?
答案 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
)
现场演示
答案 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);