2012-10-02 57 views
5

我想要做的是找到括在大括號中的所有空格,然後用另一個字符替換它們。替換大括號內的所有空格

喜歡的東西:

{The quick brown} fox jumps {over the lazy} dog 

要更改爲:

{The*quick*brown} fox jumps {over*the*lazy} dog 

我已經在網上搜索,但只這是我得到了什麼,到目前爲止,它似乎很接近我真正想要的。

preg_replace('/(?<={)[^}]+(?=})/','*',$string); 

我的問題與上面的代碼是,它取代了一切:

{*} fox jumps {*} dog 

我一直在尋找到正則表達式的教程搞清楚應該怎麼修改上面的代碼,只替換空間,但無濟於事。任何意見將不勝感激。

謝謝。

+1

只是字符串爆炸所產生的陣列「*」。抱歉,我太累了,不能寫一個例子。 – noel

回答

5

假設所有的括號是正確的嵌套,並且沒有嵌套的大括號,您可以使用前向斷言做到這一點:

$result = preg_replace('/ (?=[^{}]*\})/', '*', $subject); 

這符合並僅替換如果下一個支柱是一個封閉的空間括號:

(?=  # Assert that the following regex can be matched here: 
[^{}]* # - Any number of characters except braces 
\}  # - A closing brace 
)  # End of lookahead 
+0

謝謝。這工作出色。不過,我正在嘗試使用PHP字符串函數(strpos,substr等)的解決方案。你仍然建議使用正則表達式?我讀過關於正則表達式很慢等等。 – Bibokid

+2

@Bibokid:你可以剖析Zaffy和我的解決方案,並找出 - 正則表達式不一定很慢(但通常它們的構造非常不穩定,使它們變得緩慢,因爲當聰明的解決方案也可用時,它們必須暴力破解) 。在許多情況下,正則表達式庫經過高度優化,比使用字符串函數構建自己的解決方案快得多。 –

1

如何:

$a = '{The quick brown} fox jumps {over the lazy} dog'; 
$b = preg_replace_callback('/\{[^}]+\}/sim', function($m) { 
    return str_replace(' ', '*', $m[0]); 
}, $a); 
var_dump($b); // output: string(47) "{The*quick*brown} fox jumps {over*the*lazy} dog" 
+0

謝謝。我也會嘗試,並與其他解決方案進行比較。 – Bibokid

2

我反應喲你評論說你不想使用正則表達式,只是字符串操作。沒關係,但爲什麼你寫了你正在尋找一個正則表達式?

解決方案wihout正則表達式:空格,然後貓之間重新在一起,其間

<?php 

$str = "{The quick brown} fox jumps {over the lazy} dog"; 

for($i = 0, $b = false, $len = strlen($str); $i < $len; $i++) 
{ 
    switch($str[$i]) 
    { 
     case '{': $b = true; continue; 
     case '}': $b = false; continue; 
     default: 
     if($b && $str[$i] == ' ') 
      $str[$i] = '*'; 
    } 
} 

print $str; 

?> 
+0

這只是當我在等待這個在stackoverflow中的響應,我正在試驗一個非正則表達式的解決方案進入我的腦海。謝謝你,我也會試一試。 – Bibokid