preg_replace $ variable with string

时间:2018-01-29 11:49:09

标签: php preg-replace

我在这个主题上找到了几个问题,但没有解决方案的目的:

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

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

3 个答案:

答案 0 :(得分:3)

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之前删除空格,请在模式中\s*之前添加$name以匹配0 +空白字符。

另一种选择:

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

请参阅another PHP demo

在这里,

  • \s* - 匹配0+空白字符
  • \( - (字符
  • $name - $name变量
  • 中的文字
  • \) - 文字)字符。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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

/\(|\)/|\$name/

你的正则表达式在管道之前和结束括号之后的斜杠)/|有语法错误。它是未转义的,也是你的正则表达的逃脱角色。 (这意味着它也出现在你的正则表达式的开头和结尾。)你需要先删除它。

您将获得一个类似于/\(|\)|\$name/的正则表达式。有了它,你的函数调用有以下逻辑:

  1. 删除所有左括号
  2. 删除所有右括号
  3. 删除字符串$name
  4. 这显然不是你想要的。您希望删除$name变量中用括号括起来的所有单词出现。

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

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

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

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