[英]Is it possible to change PHP functions' default parameters?
例如, trim()
不会删除U + 3000(中文中使用的空格字符)。 更改trim()
每个实例以包含U + 3000将很麻烦。 是否可以修改trim()
的默认参数?
同样,PHP的正则表达式\\s
也与U + 3000不匹配。 是否可以使\\s
匹配U + 3000?
不幸的是trim()
不是mbstring函数集( mb_*
)的一部分。 否则,您可以简单地启用mbstring的Function Overloading Feature 。
但是由于使用了PHP的名称空间后备策略 ,因此可以:
对于函数和常量,如果没有命名空间的函数或常量,PHP将退回到全局函数或常量。
也就是说,您可以覆盖trim()
( 不是 \\trim()
)。 您必须使用名称空间并进行修整,而不必显式为全局名称空间添加前缀(即,没有\\
前缀)。
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()
之前进行。 这是在单元测试中模拟time()
一种非常有吸引力的技术。
关于第二个问题,如果打开u
-switch(PCRE_UTF8) , \\s
将匹配U + 3000:
var_dump(preg_match("/\s/u", " "));
不,如果不修改C源代码,就不可能修改trim()
函数的内部工作方式。 但是,您可以创建一个新函数,例如customTrim()
,然后编写代码以删除所有要删除的字符。 仅当您事先知道这些字符串中可能出现的空白字符时才有可能。
如果需要使用preg_replace()
进行此操作,则可以使用以下命令:
$str = preg_replace('/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $str);
正则表达式来自此博客条目 。 它将删除所有空格字符(包括与\\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)
我认为您无法在PHP中重载函数(但长期以来没有PHP)。 相反,您可以根据需要编写自己的函数,首先调用trim。 然后看一下str_replace()函数; 您可能可以用“一个空字符”(即“”)“替换”中文Unicode空格字符。 如何在代码中编写代码似乎取决于字符编码,另请参见替换unicode字符
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.