1

替换仅在括号外而不在括号内的文本。

我试过这样

  $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***)

4

4 回答 4

1

使用负回溯和前瞻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

于 2013-03-27T10:54:27.453 回答
1

()在正则表达式中有含义,尝试使用\(and转义它们\)

于 2013-03-27T10:36:42.257 回答
1

尝试这个:s3+(?=[^()]*(\(|$))

它使用前瞻来确认括号。

例子:

$pro_name = samsung galaxy s3 (s3);
$new_pro_name = preg_replace("/s3+(?=[^()]*(\(|$))/g", 's5', $pro_name);
echo $new_pro_name;
于 2013-03-27T10:49:28.363 回答
1

尝试这个 :

  $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)

参考: http: //php.net/manual/en/function.preg-replace.php

于 2013-03-27T10:42:12.447 回答