我在这个主题上找到了几个问题,但没有解决方案的目的:
$name = 'Adam';
$line = 'This is (Adam) Eve!';
$newline = preg_replace('/\(|\)/|\$name/','',$line);
我的输出应该是This is Eve
...知道我的代码有什么问题吗?谢谢你的帮助!
答案 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/
的正则表达式。有了它,你的函数调用有以下逻辑:
$name
这显然不是你想要的。您希望删除$name
变量中用括号括起来的所有单词出现。
这可以通过以下函数调用来实现:
$newline = preg_replace("/\($name\)/", '', $line);
如果要使括号可选,请使用问号运算符表示它们不是必需的:
$newline = preg_replace("/\(?$name\)?/", '', $line);