2014-06-09 76 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) 
相关问题