例如,trim()
不会删除U + 3000,即中文中使用的空格字符。将trim()
的每个实例更改为包含U + 3000将会非常麻烦。是否可以修改trim()
的默认参数?
此外,PHP的正则表达式\s
也与U + 3000不匹配。是否有可能以\s
匹配U + 3000?
答案 0 :(得分:3)
不幸的是trim()
不属于mbstring的函数集(mb_*
)。否则,您只需启用mbstring's Function Overloading Feature。
但是感谢PHP namespace fallback policy,这是可能的:
对于函数和常量,如果不存在命名空间函数或常量,PHP将回退到全局函数或常量。
即。您可以覆盖trim()
(不 \trim()
)。您必须使用namespaces并调用trim而不显式添加前缀global namespace(即没有\
前缀)。
namespace myns;
function trim($str, $charlist=" ") {
$pregCharacters = preg_quote($charlist);
return preg_replace("/^[$pregCharacters]+|[$pregCharacters]+$/", '', $str);
}
var_dump(trim(" a b c "));
没有太多关于RegExp的想法。它应该只是说明trim()
的重写。
功能
AFAIK唯一需要注意的是\myns\trim()
的定义应该在您第一次trim()
来电之前发生。对于mocking time()
单元测试来说,这是一种非常有吸引力的技术。
关于您的第二个问题,如果您打开u
-switch (PCRE_UTF8),\s
将匹配U + 3000:
var_dump(preg_match("/\s/u", " "));
答案 1 :(得分: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)
答案 2 :(得分:-2)
我认为你不能在PHP中重载函数(但很久没有PHP)。相反,如果需要,你可以先编写自己的函数调用trim。然后看看str_replace()函数;你或许可以'#34;替换"中文Unicode空格字符由"空字符" (即'')。如何在代码中编写代码似乎取决于您的字符编码,另请参阅Replace unicode character