例如,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