2013-03-27 23 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