我完全坚持这个。
我编写了这个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文件的全部内容。
非常感谢任何帮助。 感谢
答案 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
(正确匹配)