【问题标题】:PHP preg_replace unexpected Output in case of matching special Character '$'PHP preg_replace 在匹配特殊字符'$'的情况下出现意外输出
【发布时间】:2015-01-04 15:06:20
【问题描述】:

我在 PHP 脚本中遇到问题,如果此函数用于正则表达式匹配和替换。 我在 www.regex101.com 上测试了我的正则表达式并得到了预期的结果,但在 PHP 中却没有。

我在函数中使用这个模式:

$matchedName = preg_replace("/^(\$|\(.+\))( ?)/", "", $name);

匹配字符'$'或括号中的任何表达式在开始并删除它。任何带括号的输入都可以正常工作。

$name = "$ blah";
$matchedName = preg_replace("/^(\$|\(.+\))( ?)/", "", $name);
var_dump($matchedName);

Output:
string(8) "$ blah"

现在,我是不是误会了什么?或者在“$”字符的情况下,这个函数真的是一个问题吗?

感谢任何回复

【问题讨论】:

  • 所以要删除字符串中的空格?
  • 想要的输出是什么?

标签: php regex preg-replace special-characters


【解决方案1】:

你需要转义\,所以你的代码应该是:

$name = "$ blah";
$regex = "/^(\\\$|\(.+\))( ?)/";
$matchedName = preg_replace($regex, "", $name);

var_dump($regex);
var_dump($matchedName);

Demo

问题在于您使用双引号 ("..."),因此 PHP 解释器将第一个 \ 解释为仅转义字符串中的 $,而不是文字 \。为了在正则表达式中转义字符,它必须是文字 \

因此,在处理器解释后,您的实际正则表达式如下所示:/^($|\(.+\))( ?)/。您需要转义双引号内的$并且在正则表达式上下文中提供一个斜杠,因此您添加\\

请注意,您可以通过简单地使用单引号 ('...') 来避免这种情况,并且您只需要 \$ 而不是 \\\$

$name = "$ blah";
$regex = '/^(\$|\(.+\))( ?)/';
$matchedName = preg_replace($regex, "", $name);

var_dump($regex);
var_dump($matchedName);

Demo

【讨论】:

  • 这看起来是正确的解释,但它不成立。尝试使用 echo() 原始正则表达式,而不是与 preg_match() 一起使用它,您会发现 PHP 不会将美元符号 ($) 解释为变量(因为它后面没有允许的字符在变量名中)。
  • 我想你可能误解了我的意思。我并不是说 PHP 否则 将其解释为一个变量。我是说第一个斜杠除了告诉它$ 是一个文字字符之外什么也没做。
  • 哎呀,你是对的。仔细观察echo() 的输出,发现第一个反斜杠被吞下了,正如你所说的那样,转义了$。我之前评论的时候没有引起足够的重视。
【解决方案2】:
$re = "/^(\\$|\\(.+\\))( ?)/im";
$str = "\$ blah";
$subst = "";

$result = preg_replace($re, $subst, $str);

试试这个。这是有效的。

【讨论】:

  • 我做到了。这是正确的,但没有提供问题的解释。
  • 将正则表达式括在撇号中更好,因为它需要较少的转义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多