2013-07-19 43 views
4

我認爲一個正則表達式可能會做到這一點,但我還沒有能夠想出一個有效的方法。我有一些相當長的PHP字符串,我需要清理。在某些情況下,出現 而不是單個空格字符,而在其他情況下   (等)出現。我想用一個空格來替換所有的單個 ,但是保留其他地方,以保持意圖。如何用一個空格替換單個 's,但是,如果有多個  s,該怎麼辦?

有什麼想法?我認爲可以在這裏使用正則表達式,但我一直在努力爭取一段時間!

+0

而你想要更換一個空間+  ? –

+0

Swishhhhh-HoHe-Swishhhhh-這裏有人嗎?你在你的代碼編輯器中做這個嗎?在這種情況下,你的編輯器是什麼? –

+1

另一種想法 - 使用'preg_replace_callback('#( )+#')',回調函數檢查它是否匹配一個' '或多個並且相應地返回替換字符串。 – DCoder

回答

11

您必須使用否定的後視和負視向,以確保您沒有其他 左右。

$str = preg_replace('~(?<!&nbsp;)&nbsp;(?!&nbsp;)~i', ' ', $str); 

更多關於環視的信息here

+0

負面看看效果很好,我只需要在導入文本時運行一次,所以我並不擔心性能。 – Programming123

1

使用明確的正則表達式匹配(not-&nbsp;)&nbsp;(not-&nbsp;)並添加替換爲$1 $2(匹配1空格匹配2)。您可能必須明確將not-&nbsp;編碼爲([^;]|[^p];|[^s]p;|[^b]sp;|[^n]bsp;|[^&]nbsp;)

編輯:雖然[negative] lookarounds可能有用(當然也可能更少的代碼),但您可能需要測量每種方法的速度。我發現正則表達式中的某些機制可能比其他機制慢得多,儘管我不能直接說出查找速度。如果速度成爲問題,您可以跳過正則表達式,並使用strpossubstring操作和測試的組合,即使它們創建起來更麻煩,它們通常比正則表達式要快得多。我建議這只是因爲你有一個非常明確的字符串,你正在尋找;用較少的確定字符串,正則表達式肯定是要走的路。

對於此實例(使用僞代碼),您的字符串strpos搜索將是一個簡單的strpos($mystring, "&nbsp;"),一旦找到匹配項,請致電strpos($mystring, "&nbsp;&nbsp;")。如果兩個index調用返回相同的值,則可以跳過此替換並在索引點之後搜索字符串(在indexDoubleFound + 12之後開始您的單一&nbsp;搜索,但在indexDoubleFound + 6之後開始您的雙&nbsp;搜索以確保您不會錯過任何並且你不會無意中更換)。

+0

更新我的答案,在PHP中使用正確的函數名稱('strpos'而不是'index')。 – abiessu

相關問題