2010-09-29 77 views
4

我需要刪除字符串中的所有空格,但引號應該保持原樣。刪除空白字符,除了PHP中的引號?

下面是一個例子:

string to parse: 
hola hola "pepsi cola" yay 

output: 
holahola"pepsi cola"yay 

任何想法?我確信這可以用正則表達式完成,但任何解決方案都可以。

+0

能雙引號引號之間的逃脫,或者是一個非(例如,應該「hola hola」百事可樂「yay」變成「holahola」百事可樂「yay」或「hola hola」百事可樂「yay」)? – Wrikken 2010-09-29 21:08:50

回答

5

我們可以匹配字符串或報價與

[^\s"]+|"[^"]*" 

所以我們只需要preg_match_all和串聯的結果。


Example

$str = 'hola hola "pepsi cola" yay'; 

preg_match_all('/[^\s"]+|"[^"]*"/', $str, $matches); 

echo implode('', $matches[0]); 
// holahola"pepsi cola"yay 
2

馬爾蒂,復活這個問題,因爲它有一個簡單的解決方案,可以讓你一氣呵成,無需破滅替換。 (發現你的問題而做一些研究的一般問題有關how to exclude patterns in regex

下面是我們簡單的regex:

"[^"]*"(*SKIP)(*F)|\s+ 

交替的左側匹配完整"quoted strings"然後故意失敗。右側匹配空格字符,並且我們知道它們是正確的空白字符,因爲它們沒有與左側表達式匹配。

這段代碼演示瞭如何使用正則表達式(見本online demo底部的結果):

<?php 
$regex = '~"[^"]*"(*SKIP)(*F)|\s+~'; 
$subject = 'hola hola "pepsi cola" yay'; 
$replaced = preg_replace($regex,"",$subject); 
echo $replaced."<br />\n"; 
?> 

參考

How to match (or replace) a pattern except in situations s1, s2, s3...