preg_replace $变量与字符串

preg_replace $variable with string

我发现了几个关于这个主题的问题,但没有适合我的解决方案:

$name = 'Adam';
$line = 'This is (Adam) Eve!';
$newline = preg_replace('/\(|\)/|$name/','',$line);

我的输出应该是This is Eve...知道我的代码有什么问题吗?感谢您的帮助!

使用strtr函数代替正则表达式

$name = 'Adam';
$line = 'This is (Adam) Eve!';
$line = strtr($line, array('(' => '',$name=>'', ')' => ''));

single quoted PHP string literals中,变量没有展开。此外,由于 $ 被转义,它被匹配为文字字符。 $name 匹配 $name 子字符串,而不是 Adam。此外,| 之前的 / 破坏了整个模式过早地结束它。

也许,您想使用

$name = 'Adam';
$line = 'This is (Adam) Eve!';
$newline = preg_replace("/\(|\)|$name/",'',$line);
echo $newline;

参见PHP demo。要去除 Eve 之前的 space,请在模式中的 $name 之前添加 \s* 以匹配 0+ 白色 space 个字符。

另一种选择:

preg_replace("/\s*\($name\)/",'','This is (Adam) Eve!')

参见 another PHP demo

这里,

  • \s* - 匹配 0+ 个白色space 个字符
  • \( - 一个 ( 字符
  • $name - $name 变量中的文本
  • \) - 文字 ) 字符。

首先,您可能想了解 double and single enquoted strings in PHP

那么你的正则表达式格式错误,也不是你想要的。

/\(|\)/|$name/

您的正则表达式在管道之前和右括号之后的斜线 )/| 存在语法错误。它是未转义的,也是您的正则表达式的转义字符。 (这意味着它也出现在正则表达式的开头和结尾。)您需要先将其删除。

你会得到一个看起来像这样的正则表达式 /\(|\)|$name/。有了它,您的函数调用具有以下逻辑:

  1. 删除所有左括号
  2. 或删除所有右括号
  3. 或删除字符串 $name

那显然不是你想要的。您想要删除 $name 变量中出现的所有用方括号括起来的单词。

这可以通过以下函数调用来实现:

$newline = preg_replace("/\($name\)/", '', $line);

如果要使括号可选,请​​使用问号运算符表示它们不是必需的:

$newline = preg_replace("/\(?$name\)?/", '', $line);