2010-07-03 66 views
0

我想給~更換成|在folowwing情況下[]之間:PHP有條件的字符串替換

{stackoverflow is a [cool~great~fast] website ~ Find your answers [easily~quickly] on stackoverflow}. 

注:[]之間的文本可以是多。

我試過多個正則表達式但沒有運氣。

我此刻最接近的呼叫:

$text = preg_replace("/\[(.*?)~(.*?)\]/i", "[$1|$2]", $text); 

但返回

{stackoverflow is a [cool~great|fast] website ~ Find your answers [easily|quickly] on stackoverflow}. 
+0

您應該報告您嘗試過哪些正則表達式。這可能是你犯了一個錯誤,而正則表達式是不正確的。 – kiamlaluno 2010-07-03 22:48:44

+0

括號可以嵌套嗎? – sepp2k 2010-07-03 22:49:36

+0

括號不能嵌套 – brechtvhb 2010-07-03 22:59:17

回答

2

您需要使用一個正則表達式來查找括號中的所有字符串,然後使用另一個替換其中的~。您可以使用preg_replace_callback~ -replacing正則表達式應用到所有的子括號中是這樣的:

preg_replace_callback('/\[[^\]]+\]/', function ($str) { 
    return str_replace('~', '|', $str[0]); 
}, $my_string) 
+0

作品:)非常感謝! – brechtvhb 2010-07-03 23:06:23

+0

我會在回調中使用str_replace而不是preg_replace,因爲調用任何preg函數都相當昂貴,所以您可以使用str_replace('〜','|',$ str [0])來獲得相同的效果。 – tsgrasser 2010-07-03 23:18:29

+0

@tsgrasser:夠公平的。完成。 – sepp2k 2010-07-03 23:24:18

0

是在正則表達式的一些例子你使用什麼樣的?我的直接想法是,[]正在讓你失望,因爲它被用來匹配字符類。如果你想匹配[或]作爲一個文字,你必須用反斜槓來轉義它:\ [或\]。

+0

我最接近的電話是preg_replace(「/\[(.*?)〜(。*?)\]/i」,「[\ 1 | \ 2]」,$ text); 但我得到一個奇怪的字符,而不是文本。 – brechtvhb 2010-07-03 22:49:28

+0

[]被轉義,但是stackoverflow由於某種原因刪除了\之前的\。 – brechtvhb 2010-07-03 22:50:40

+0

@brechtvhb:你會得到有趣的角色,因爲'\ 1'和'\ 2'在雙引號中的含義與單引號不同。如果我使用單引號並跳過括號,那麼對於使用正則表達式的簡單案例,我會得到正確的結果。然而,當括號內有多個「〜」時它不起作用(每個括號中只有第一個被替換)。 – sepp2k 2010-07-03 23:11:09

2

簡單的比你想象的

echo preg_replace('/~(?=[^\[\]]*\])/s', '|', $a); 

=是lookahead assertion和讀取「其次是」。也就是說,「一個代字符後跟一些非括號,然後是一個右括號」 - 這隻與〜的內部匹配[]

+0

這也將代替「~1a」中的〜,即它不需要在代字號之前出現左括號。這可能不是問題,所以+1。 – sepp2k 2010-07-04 14:06:24