2012-04-09 83 views

回答

2

希望你仍在尋找,或回來檢查!這似乎爲我工作:

'/\s+((["\']).*?(?=\2)\2)|\s\s+/' 

...與 $1

編輯替換

另外,如果你需要允許轉義引號像\"\',你可以使用這個表達式:

'/\s+((["\'])(\\\\\2|(?!\2).)*?(?=\2)\2)|\s\s+/' 

如果你想要一個dd支持「平衡」引號,如括號(例如(){}

編輯完

我們如果發現問題或想一些解釋我知道!


希望最後編輯和警告

  • 潛在的問題:如果一個引號的字符串開始於字符串變量(或文件)的開頭,它要麼不能算作一個帶引號的字符串(並減少任何空白),否則它將拋出整個事情,使得任何不引用引號的內容都被視爲引用內容,反之亦然 -
    • 可能解決此問題的潛在更改是使用以下匹配表達式
    • /(?:^|\s+)((["\'])(\\\\\2|(?!\2).)*?(?=\2)\2)|\s\s+/
    • 這種替代\s+(?:^|\s+)在表達
    • 這將在如果字符串以報價開始變的開頭添加一個空格的開始 - 只是修剪()或刪除空白繼續
  • 我似乎已經使用「逐行」方法(如sed,如果我沒有弄錯)來達到我的原始結果 - 如果使用「整個文件」或「整個字符串」設置或方法,回車換行似乎算作兩個空格c漢字(無法想象爲什麼...),從而把任何換行符成單個空格(除非它們是內的報價和「點百搭換行」時,當然)
    • 這可以通過與特定的字符替換.\s速記字符類來解決要匹配,如下所示:
    • /(?:^|[ \t]+)((["\'])(\\\\\2|(?!\2)[\s\S])*?(?=\2)\2)|[ \t]{2,}/
    • 這不需要點火柴換行開關,只替換多個空格或製表符 - 不換行 - 用一個空格(當然,只有當它們沒有被引用時)

This link示出了第一表達和最後一個表達式在樣本文本的使用對http://codepad.viper-7.com

+0

這是刪除雙引號中的字符串的一部分。 - 這是一個「句子」不起作用 - 變成 - 這是行不通的 - – Kovo 2012-04-09 18:44:08

+0

使用/ \ s +(([「\'])(\\\\ 2 |(!!\ 2)。 )*?(?= \ 2)\ 2)| \ s \ s +/ – Kovo 2012-04-09 18:44:28

+0

@Kovo是否替換爲「$ 1」(即包含空格的字符串,後跟美元符號,後跟1?)如果是這樣的話,我不確定你的問題是不是 - 我仍然在想... – 2012-04-09 18:49:24

2

你可以在幾個步驟中做到這一點。請看下面的例子:

$str = 'This is a string with "Bunch of extra spaces". Leave them "untouched !".'; 

$id = 0; 
$buffer = array(); 
$str = preg_replace_callback('|".*?"|', function($m) use (&$id, &$buffer) { 
    $buffer[] = $m[0]; 
    return '__' . $id++; 
}, $str); 
$str = preg_replace('|\s+|', ' ', $str); 
$str = preg_replace_callback('|__(\d+)|', function($m) use ($buffer) { 
    return $buffer[$m[1]]; 
}, $str); 

echo $str; 

這將輸出字符串:

This is a string with "Bunch of extra spaces". Leave them "untouched !". 

雖然這不是最漂亮的解決方案。

+0

有趣的方法的例子。這會奏效,但在較大的琴絃上會變得相當沉重,並且演奏成爲我特別需要的關注點。當然,如果沒有「一條線」解決方案,那麼我將別無選擇! – Kovo 2012-04-09 14:48:00

+0

字符串會發生什麼?'This string will __0'break you''? – 2012-04-09 16:37:42

相關問題