我在这个主题上找到了几个问题,但没有针对我的目的的解决方案:
$name = 'Adam';
$line = 'This is (Adam) Eve!';
$newline = preg_replace('/\(|\)/|\$name/','',$line);
我的输出应该是This is Eve
...知道我的代码有什么问题吗?谢谢你的帮助!
在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!')
这里,
\s*
- 匹配0+空格字符\(
- (
变量中的文本使用strtr函数而不是正则表达式
$name
首先,您可能想了解$name
。
然后你的正则表达式格式错误,也不是你想要的。
\)
你的正则表达式在管道之前和结束括号之后的斜杠)
有语法错误。它是未转义的,也是你的正则表达的逃脱角色。 (这意味着它也出现在你的正则表达式的开头和结尾。)你需要先删除它。
你会得到一个看起来像这个$name = 'Adam';
$line = 'This is (Adam) Eve!';
$line = strtr($line, array('(' => '',$name=>'', ')' => ''));
的正则表达式。使用它,您的函数调用具有以下逻辑:
这显然不是你想要的。您想要删除qazxsw poi变量中出现的所有单词,这些单词用括号括起来。
这可以通过以下函数调用来实现:
/\(|\)/|\$name/
如果要使括号可选,请使用问号运算符指示它们不是必需的:
)/|