2014-01-14 45 views
1

我如何通過PHP正則表達式找到並替換字符串中所有未包裝的項目?PHP正則表達式:未包裝的項目

例如,我有源字符串「2a {2} b2ac1 {1} a {2} aab12 {1} b2a {1} 2」並嘗試查找符號「2」和 「}」,在此之後,取而代之的是 「{3}」:

$input_lines = "2a{2}b2ac1{1}a{2}aab12{1}b2a{1}2"; 
$regex = "/[^\{](2)[^\}]/"; 
$input_lines = preg_replace("/[^\{](2)[^\}]/", "{3}", $input_lines); 
echo $input_lines; 
// 2a{2}{3}c1{1}a{2}aab{3}1}{3}{1{3} 

怎麼可以看到,它現在工作:(

+0

澄清:你想'123'轉向'1 {3} 2',但沒有什麼應該發生'1 {2} 3' ..正確? – Sam

+0

@SamSullivan,「123」轉向「1 {3} 3」,1 {2} 3沒有任何發生。只需將所有「2」替換爲「{3}」,但不要替換「{2}」。 – uzumaxy

回答

2

/(?<!{)2(?!})/將會訣竅。更新以照顧等場景。

$input_lines = '2a{2}b2ac1{1}a{2}aab12{1}b2a{1}2'; 
$input_lines = preg_replace('/(?<!{)2(?!})/', '{3}', $input_lines); 

var_dump($input_lines); 
// string(42) "{3}a{2}b{3}ac1{1}a{2}aab1{3}{1}b{3}a{1}{3}" 

說明:

/         # Beginning delimiter 
(?<!{)       # Lookbehind for anything other than { 
    2        # Match 2 
(?!})       # Lookahead for anything other than } 
/        # Ending delimiter 
+0

嘿,它的工作:http://www.phpliveregex.com/p/32n謝謝你! – uzumaxy

+0

沒問題,請選擇是否有效。還要查看[lookaheads](http://www.regular-expressions.info/lookaround.html)上的一些信息。如果您需要我的RegEx的解釋,我可以提供。 – Sam

+2

這個邏輯是錯誤的。它匹配沒有跟隨'{'的'2'。他要求'2'不是'{2}',這是不同的。 –

5

你可以試試這個:

$input_lines = preg_replace('/(?<!{)2(?!})/', '{3}', $input_lines);