【问题标题】:PHP preg_match_all wont find valuesPHP preg_match_all 找不到值
【发布时间】:2015-10-12 20:19:27
【问题描述】:

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


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

【问题讨论】:

  • CData 是否总是包含十进制数?
  • 是的,cdata 应该始终包含 cdata
  • 如果 XML 创建者决定不使用 CDATA 怎么办?
  • 您是要检查是否存在或捕获?

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


【解决方案1】:
$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】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 这也会抓取 CDATA 块之外的十进制值,不确定您是否打算这样做
      • @iam-decoder 好吧,他只显示一个字符串,并询问我们如何从一个字符串中获取两个值。
      猜你喜欢
      • 1970-01-01
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      • 2011-04-12
      • 1970-01-01
      相关资源
      最近更新 更多