完全停留在可以在测试沙箱上运行的RegEx但不能正常工作

时间:2013-12-27 21:11:48

标签: php regex

我完全坚持这个。

我编写了这个RegEx模式,它应该从一个文件中获取字符串的值,该文件的内容是我用file_get_contents();

我写的RegEx是这样的:

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

我的功能是:

function tbs_quick_setting_find($variable) {
global $savedsettings;
$setting = preg_replace("/.*\$".$variable."\s*=\s*'?(.*?)'?;.*/is",'$1',$savedsettings);
if (!empty($setting)) {
    return $setting;
} else {
    return false; // value is NOT set
    }
}

奇怪的是,这在测试时效果很好,就像这里:http://regex101.com/r/wN4lJ3 但是当我在我的网站上测试它时,它不起作用,而不是变量的值我得到$ savedsettings文件的全部内容。

非常感谢任何帮助。 感谢

2 个答案:

答案 0 :(得分:2)

使用PHP正则表达式匹配$符号 - 如何以及为什么要逃避

我通常将模式放在单引号中,其中单个\应足以将$作为文字转义。要在双引号正则表达式模式中匹配$,事情可能会令人困惑。

所有这些变体应该有效:

1。)对于模式使用单引号一个 \应足以逃脱$作为文字

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

2。)Imho使用双引号,你必须双重逃避 $,因为在正则表达式模式中它是metacharater匹配字符串或行尾的位置,另外它在双引号内插入一个变量。为什么要逃避呢?不知道: - )

"/.*\\$".$variable."\s*=\s*'?(.*?)'?;.*/is"

3。)无论您是使用双重引号还是单引号引用模式,都应该安全地将$放入character class

"/.*[$]".$variable."\s*=\s*'?(.*?)'?;.*/is"

请随意评论/纠正,我错了。

答案 1 :(得分:1)

试试这个:

function tbs_quick_setting_find($variable) {
  global $savedsettings;
  $re = "/.*\\\$" . $variable . "\s*=\s*'?(.*?)'?;.*/is"; 
  $setting = preg_replace($re,'$1',$savedsettings);
  if (!empty($setting)) {
      return $setting;
  } else {
      return false; // value is NOT set
  }
}

问题在这里\\\$。我们需要为表达工作提供“\”和“$”字符。

例如:

echo "/.*\$".$variable."\s*=\s*'?(.*?)'?;.*/is";

将吐出此表达式/.*$test_variable\s*=\s*'?(.*?)'?;.*/is(与任何内容不匹配)

正确的方法是:

echo "/.*\\\$".$variable."\s*=\s*'?(.*?)'?;.*/is";

吐出此表达式/.*\$test_variable\s*=\s*'?(.*?)'?;.*/is(正确匹配)