替换仅在括号外而不在括号内的文本。
我试过这样
$pro_name = samsung galaxy s3 (s3);
$new_pro_name = preg_replace("/\b(s3)\b/i",***s5****,$pro_name);
echo $new_pro_name;
预期结果:
samsung galaxy ***s5**** (s3)
输出:
samsung galaxy ***s5*** (***s5***)
使用负回溯和前瞻http://www.regular-expressions.info/lookaround.html
我们可以使用以下内容:
$pro_name = 'samsung galaxy s3 (s3)';
$new_pro_name = preg_replace("/(?<!\()s3(?!\))/i", '***s5****', $pro_name);
echo $new_pro_name;
注意(?<!x)
回顾不能是'x'的前一个字符。在你的情况下,这需要(
但是因为这是一个特殊字符,它需要被转义为\(
并且(?!x)
正在寻找不是 x 的字符。
有关 REGEX 中使用的特殊字符的细分,请参阅 php 的preg_quote();
http://php.net/manual/en/function.preg-quote.php
(
并)
在正则表达式中有含义,尝试使用\(
and转义它们\)
。
尝试这个:s3+(?=[^()]*(\(|$))
它使用前瞻来确认括号。
例子:
$pro_name = samsung galaxy s3 (s3);
$new_pro_name = preg_replace("/s3+(?=[^()]*(\(|$))/g", 's5', $pro_name);
echo $new_pro_name;
尝试这个 :
$pro_name = "samsung galaxy s3 (s3)";
$new_pro_name = preg_replace("/(.*)s3(.*)\((.*)\)/i","$1s5$2($3)",$pro_name);
echo $new_pro_name;
输出 :samsung galaxy s5 (s3)