2014-06-09 75 views
1

例如,trim()不會刪除U + 3000,即中文中使用的空格字符。將每個trim()的實例更改爲包含U + 3000將會很麻煩。是否可以修改trim()的默認參數?是否可以更改PHP函數的默認參數?

此外,PHP的正則表達式的\s也不符合U + 3000。是否有可能以某種方式使\s與U + 3000相匹配?

+4

_「是否可以修改'修剪()'的默認參數?」 _ - 只有當您更改C源代碼並編譯您自己的PHP。 – CBroe

+1

創建一個'myTrim()'函數,用你需要的附加參數調用'trim()',然後用它來代替 –

+0

爲什麼不使用str_replace? – Dimitri

回答

3

不幸trim()不MBSTRING的功能集(mb_*)的一部分。否則,您可以簡單地啓用mbstring's Function Overloading Feature

但由於PHP的namespace fallback policy有可能:

對於函數和常量,PHP將回落至全局函數或常量,如果一個命名空間的函數或常量不存在。

I.e.您可以覆蓋trim()而不是\trim())。您必須使用namespaces並呼叫修剪,而不必在global namespace前加前綴(即沒有0​​前綴)。

namespace myns; 

function trim($str, $charlist="  ") { 
    $pregCharacters = preg_quote($charlist); 
    return preg_replace("/^[$pregCharacters]+|[$pregCharacters]+$/", '', $str); 
} 

var_dump(trim(" a b c ")); 

沒有想太多關於正則表達式。它應該只是說明重寫trim()

據我所知,你必須照顧的唯一的事情是,\myns\trim()定義應你的第一個trim()調用之前發生。這對於單元測試中的mocking time()非常有吸引力。


關於你提到的第二個問題,如果你打開u-switch (PCRE_UTF8)\s將匹配U + 3000:

var_dump(preg_match("/\s/u", " ")); 
-2

我認爲你不能在PHP中重載函數(但很長一段時間沒有PHP)。相反,如果需要,可以先編寫自己的函數,然後調用trim。之後看看str_replace()函數;您可以用「空字符」(即'')來「替換」中文Unicode空格字符。如何在代碼中編寫代碼似乎取決於您的字符編碼,另請參閱Replace unicode character

+1

'str_replace()'將刪除搜索字符的所有出現,而OP需要僅從開始和/或結束刪除它們。它們不相同。 –

0

不,不可能在不修改C源代碼的情況下修改trim()函數的內部工作方式。但是,您可以創建一個新功能,如customTrim(),然後編寫代碼以刪除您要刪除的所有字符。這隻有在事先知道這些字符串中可能出現的空白字符時纔有可能。

如果您需要preg_replace()要做到這一點,你可以使用以下命令:

$str = preg_replace('/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $str); 

正則表達式爲this blog entry。它將刪除所有空白字符(包括與\s匹配的字符),控制字符。它還將刪除Unicode字符'IDEOGRAPHIC SPACE'(U + 3000)。

測試用例:

$str = ' '; 
$str = preg_replace('/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $str); 
var_dump($str, mb_strlen($str)); 

輸出:

string(0) "" 
int(0) 
相關問題