例如,trim()
不會刪除U + 3000,即中文中使用的空格字符。將每個trim()
的實例更改爲包含U + 3000將會很麻煩。是否可以修改trim()
的默認參數?是否可以更改PHP函數的默認參數?
此外,PHP的正則表達式的\s
也不符合U + 3000。是否有可能以某種方式使\s
與U + 3000相匹配?
例如,trim()
不會刪除U + 3000,即中文中使用的空格字符。將每個trim()
的實例更改爲包含U + 3000將會很麻煩。是否可以修改trim()
的默認參數?是否可以更改PHP函數的默認參數?
此外,PHP的正則表達式的\s
也不符合U + 3000。是否有可能以某種方式使\s
與U + 3000相匹配?
不幸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", " "));
我認爲你不能在PHP中重載函數(但很長一段時間沒有PHP)。相反,如果需要,可以先編寫自己的函數,然後調用trim。之後看看str_replace()函數;您可以用「空字符」(即'')來「替換」中文Unicode空格字符。如何在代碼中編寫代碼似乎取決於您的字符編碼,另請參閱Replace unicode character
'str_replace()'將刪除搜索字符的所有出現,而OP需要僅從開始和/或結束刪除它們。它們不相同。 –
不,不可能在不修改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)
_「是否可以修改'修剪()'的默認參數?」 _ - 只有當您更改C源代碼並編譯您自己的PHP。 – CBroe
創建一個'myTrim()'函數,用你需要的附加參數調用'trim()',然後用它來代替 –
爲什麼不使用str_replace? – Dimitri