2010-06-29 39 views
3

我正在寫一個WordPress插件,其中一個功能是刪除重複的空格。用preg_replace匹配重複的空格

我的代碼如下所示:

return preg_replace('/\s\s+/u', ' ', $text, -1, $count); 
  • 我不明白爲什麼我需要的u 修改。我已經看到其他插件 使用preg_replace而不是 需要修改它的Unicode。我相信我有一個WordPress的默認安裝 。

  • 如果沒有修飾符,代碼 將用Unicode代替所有空格 而不是空格替換字形。

  • 使用u修飾符,我沒有得到 字形,並且它不替換所有的空格。

下面的每個空間都有1-10個空格。正則表達式僅從每個組中刪除空間。

前:

This sentence has extra space. This doesn’t. Extra space, Lots   of extra space. 

後:

This sentence has extra space. This doesn’t. Extra space, Lots   of extra space. 

$count = 9

我怎樣才能讓正則表達式替換整場比賽用一個空間?


更新:如果我嘗試這與普通的PHP,它工作正常

$new_text = preg_replace('/\s\s+/', ' ', $text, -1, $count); 

,當我在WordPress插件中使用它,它只是打破。 我使用這個功能的過濾器:

function jje_test($text) { 
    $new_text = preg_replace('/\s\s+/', ' ', $text, -1, $count); 
    echo "Count: $count"; 
    return $new_text; 
} 

add_filter('the_content', 'jje_test'); 

我曾嘗試:

  • 刪除所有其他過濾器上the_content
    remove_all_filters('the_content');
  • 更換過濾器的加入the_content的優先級,更早或更晚
  • 各種排列\s+, \s\s+, [ ]+
  • 即使有一個空字符串替換所有單個空格,不會取代空間
+0

我已經添加了一個例子,代碼的結果在這裏:http://pastebin.com/hm2JMX2w我用'R'代替了空格,所以它會更清楚什麼被替換,什麼是'噸。我正在使用WordPress的LAMP新安裝,似乎解決了unicode問題。 – jjeaton 2010-07-09 04:18:11

+0

有沒有另一種解決方案,我錯過了,不使用正則表達式? – jjeaton 2010-07-09 23:19:12

回答

6

這將替換兩個或多個空格,製表符的所有序列,和/或符合空單突破:

return preg_replace('/[\p{Z}\s]{2,}/u', ' ', $text); 

您需要/u標誌,如果$text持有編碼爲UTF-8文本。即使您的正則表達式中沒有Unicode字符,PCRE也必須正確解釋$text

我將\p{Z}添加到字符類,因爲當使用短符號(如\s,即使使用/u)時,PCRE只匹配ASCII字符。添加\p{Z}可確保所有Unicode空白符合匹配。可能還有其他空間,例如字符串中的非空白空格。

我不確定在WordPress過濾器中使用echo是不是一個好主意。

+0

這工作!謝謝!我想知道這是不是空格,儘管我沒有在HTML源代碼中看到它們。我同意使用'echo',它只是出於調試的目的來計算匹配次數。我不明白的是,爲什麼所有在同一數據庫上運行的內置wordpress函數(總是默認爲utf-8)不必使用'/ u'標誌。例如,請參閱'wp_texturize()'函數:http://wordpress.taragana.net/wp-includes/formatting.php.source.html#l3 – jjeaton 2010-07-14 02:06:59

+0

只適用於ASCII字符的正則表達式(字節0到127)即使沒有'/ u'也可以在UTF-8字符串上正常工作,因爲UTF-8被專門設計爲對只理解ASCII並且忽略大於127的字節的進程是透明的。 – 2010-07-14 03:01:42

+0

根據你對HTML源代碼的看法,你可能不會「看到」不間斷的空間,因爲它們看起來就像普通空間一樣。 – 2010-07-14 03:03:10

2

u修改只是把它變成UTF-8模式下,如果你需要做具體的事情與具有代碼字符,這是非常有用的指向0x7f以上。您仍然可以使用UTF-8編碼的字符串而不使用該修飾符,但您將無法輕鬆地專門匹配或轉換此類字符。

Unicode中有一些空白字符在0x7f以上。在大多數數據中遇到它們是非常罕見的。但是,例如,您可能會看到一個非破壞性空格字符,它是unicode \ uA0或一些較罕見的字符。

我不知道爲什麼使用它會導致輸出Unicode「替代」字形。我會說這是其他地方的問題......你輸出你的腳本爲什麼字符編碼?

+0

內容類型標頭設置爲「charset = UTF-8」,mysql數據庫排序規則設置爲utf8_general_ci,wordpress自身的閱讀設置設置爲UTF-8。所以我真的不明白一個正規的空間角色是如何被這樣解釋的。這不像我有一些奇怪的數據源。我自己輸入了數據。 – jjeaton 2010-06-30 03:01:30

+0

也許你可以在網上發佈一個工作演示 - 有人可能會看到它在做什麼,並幫助你。 – thomasrutter 2010-07-01 00:21:16

+0

我對這個問題的評論有一個鏈接,帶有結果的示例代碼。 – jjeaton 2010-07-09 04:18:59

0

不知道任何修飾,但是這並獲得成功:

<?php 
$text = ' Hi, my name is Andrés. '; 
echo preg_replace(array('/^\s+/', '/\s+$/', '/\s{2,}/'), ' ', $text); 
/* 
Hi, my name is Andrés. 
*/ 
?> 
+0

不幸的是,仍然不適合我。我也嘗試過使用'/ \ s {2,} /',並且它與我的任何內容都不匹配。也許我的wordpress/php安裝有問題嗎? – jjeaton 2010-06-30 02:50:12

+0

你從哪裏得到你的文本? – misterte 2010-06-30 16:48:45

+0

讓我更具體: 喲應該讓PHP知道'你是什麼'發送和檢索數據庫。在任何連接之後,在任何查詢之前,您應該聲明msyql_set_charset('utf8',$ connection_resource); – misterte 2010-06-30 21:34:54

0
preg_replace('!\s+!', ' ', 'This sentence has extra space. This doesn’t. Extra space, Lots   of extra space.'); 
+0

這也不起作用。 – jjeaton 2010-06-30 03:02:57

2

要回答jjeaton在我第一次回覆的評論中的後續問題,以下內容用序列中的第一個字符替換每個空格,製表符和/或換行符的序列。實際上,這會刪除每個兩個或多個空白字符序列中的第二個和後續空白字符。一個空格的運行被一個空間替代,一個標籤的運行被替換爲一個標籤等。空間和標籤的運行(按該順序)被替換爲空格,並且運行標籤並且的空間被替換爲標籤等

return preg_replace('/([\p{Z}\s])[\p{Z}\s]+/u', '$1', $text); 

此正則表達式的工作方式是第一匹配的一個空間,並用一個捕獲組,後面是一個或多個空格捕獲它。替換文本只是重新插入第一個(也是唯一)捕獲組匹配的文本。