【问题标题】:preg_match_all Does not return any in the output arraypreg_match_all 在输出数组中不返回任何
【发布时间】:2014-01-27 04:51:27
【问题描述】:

我正在尝试使用正则表达式解析字符串中的 php 变量。例如,

$str = '$str1var ="str1"; $str2var = "str2"';

会给我一个数组 ['str1var', 'str2var']

我在 php 中的正则表达式模式是:"/\$(.*?)=/s"

$pattern = "/\$(.*?)=/s";
preg_match_all($pattern, $str, $output_array);

但是 preg_match_all 返回 0(没有匹配) 我的正则表达式有什么问题?我在http://www.phpliveregex.com/ 之类的网站上进行了测试,它工作正常,但我的服务器返回 0;

我的服务器 PHP 版本是 5.1.6

【问题讨论】:

  • 似乎在这里工作。但是 PHP 5.1.6 是古老的。你有版本的选择吗? preg_match.onlinephpfunctions.com
  • 返回 0 还是 false? var_dump 应该告诉你... regex 应该可以正常工作,尽管输出应该更像 ['str1var ', 'str2var ']

标签: php regex preg-match-all


【解决方案1】:

PHP 似乎对您的模式周围的双引号有问题,也许它正在寻找一个变量,因为 $ 符号。

您的代码在any php version 中不起作用,但带有单引号的它适用于所有php 版本,请参阅example

$pattern = '/\$(.*?)=/s';

【讨论】:

  • 这修复了它。谢谢。我也刚刚意识到(基于@JakeGould 的回答)将我的模式修改为 "/\\$(.*?)=/s" 也有效。
  • @StephaniAlves var_dump($pattern); -> $(.*?)=/s 你看,如果$ 被正则表达式转义。对于正则表达式引擎,它必须被转义,因为它是 metacharacter 并且您想要匹配文字。
  • @Jonny5 谢谢。真的很有帮助。
  • @StephaniAlves:请注意,如果您使用单引号或双引号,则在简单字符串(不是正则表达式模式)中获得文字反斜杠所需的反斜杠数量是不同的。因此,如果您想在带有单引号的模式中获得转义的$,您只需要一个反斜杠。如果你想用双引号做同样的事情,你必须放两个反斜杠(注意如果你放三个反斜杠,第三个被忽略)。
【解决方案2】:

在 PHP 中,变量在双引号内解析。

【讨论】:

    【解决方案3】:
     $pattern = '/\$(?P<variable>.*?)(?:\s|)=(?:\s|)"(?P<value>.*?)"/';
    

    如果需要,返回带有值的关联数组。

    【讨论】:

      猜你喜欢
      • 2011-08-28
      • 1970-01-01
      • 2015-12-24
      • 2017-08-09
      • 2014-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-20
      相关资源
      最近更新 更多