【问题标题】:Is it possible to change PHP functions' default parameters?是否可以更改 PHP 函数的默认参数?
【发布时间】:2014-07-30 08:20:41
【问题描述】:

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

另外,PHP 的正则表达式 \s 也不匹配 U+3000。是否有可能以某种方式使 \s 匹配 U+3000?

【问题讨论】:

  • “是否可以修改 trim() 的默认参数?” – 仅当您更改 C 源代码并编译自己的 PHP 时。
  • 创建一个 myTrim() 函数,使用您需要的其他参数调用 trim(),然后改用它
  • 为什么不使用 str_replace?
  • OP 要求的是trim(),而不是\trim(),这使它成为可能。

标签: php


【解决方案1】:

很遗憾,trim() 不是 mbstring 函数集 (mb_*) 的一部分。否则你可以简单地启用mbstring's Function Overloading Feature

但是感谢 PHP 的 namespace fallback policy 是可能的:

对于函数和常量,如果命名空间函数或常量不存在,PHP 将回退到全局函数或常量。

即您可以覆盖 trim()(not \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", " "));

【讨论】:

    【解决方案2】:

    不,如果不修改 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)
    

    【讨论】:

      【解决方案3】:

      我认为你不能在 PHP 中重载函数(但很长时间没有 PHP)。相反,如果需要,您可以编写自己的函数,首先调用 trim。然后看一下 str_replace() 函数;您也许可以用“空字符”(即'')“替换”中文Unicode空格字符。如何在您的代码中编写它似乎取决于您的字符编码,另请参阅Replace unicode character

      【讨论】:

      • str_replace() 将删除所有出现的搜索字符,而 OP 只需要从开头和/或结尾删除它们。它们不相等。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 2019-12-30
      • 1970-01-01
      • 2021-10-17
      • 2021-05-04
      • 2022-11-15
      相关资源
      最近更新 更多