2013-03-27 75 views
1

替换只在括号外的文本而不在里面。请勿在preg_replace中的括号之间进行替换?

我试过这样

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

+0

括号是一个正则表达式运算符,所以用括号这样的:/ \ b \\(S3 \\)\ B/I – 2013-03-27 10:38:07

回答

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。

在正则表达式中使用的特殊字符的击穿看到PHP的preg_quote();http://php.net/manual/en/function.preg-quote.php

1

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

+0

看'preg_quote();'为的什么需要逃避http://php.net/manual/en/function.preg-quote.php – Waygood 2013-03-27 10:37:50

+0

我不能让乌尔点u可以解释 – 2013-03-27 10:40:21

+0

'特殊的正则表达式字符是一个列表:。 \ + *? [^] $(){} =! < > | :-' – Waygood 2013-03-27 10:41:38

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

+0

这是工作可以解释它如何工作? – 2013-03-27 10:44:08

+0

匹配s3和文本inside()前后的文本,并创建一个新的字符串与s3重新s5,Ref链接http://php.net/manual/en/function.preg-replace.php你会得到一个更好的想法 – 2013-03-27 10:46:13

+0

如果它有助于解决你的问题,不要忘记接受它,它可以帮助别人找到答案。 – 2013-03-27 10:48:16

1

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

它使用向前看确认支架。

例子:

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

你可以发表完整的正则表达式... – 2013-03-27 10:53:09

+0

增加了一个例子 – sybrek 2013-03-27 11:18:18