是否有可能改变PHP功能'默认参数?

时间:2014-06-09 18:14:21

标签: php

例如,trim()不会删除U + 3000,即中文中使用的空格字符。将trim()的每个实例更改为包含U + 3000将会非常麻烦。是否可以修改trim()的默认参数?

此外,PHP的正则表达式\s也与U + 3000不匹配。是否有可能以\s匹配U + 3000?

3 个答案:

答案 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