不要在preg_replace中的括号之间替换?

时间:2013-03-27 10:33:53

标签: php regex

替换仅在括号内但不在里面的文本。

我试过这个

  $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 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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

答案 2 :(得分:1)

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

使用预先确认括号。

示例:

$pro_name = samsung galaxy s3 (s3);
$new_pro_name = preg_replace("/s3+(?=[^()]*(\(|$))/g", 's5', $pro_name);
echo $new_pro_name;

答案 3 :(得分: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

相关问题