2

我一直在阅读一本关于框架的书,名为 PRO PHP MVC。在书中创建了一个 StringMethods 类。代码看起来像这样。

class StringMethods
{

private static $_delimiter = "#";

    private function __construct()
    {
        // do nothing
    }

    private function __clone()
    {
        // do nothing
    }

    private static function _normalize($pattern)
    {
        return self::$_delimiter.trim($pattern, self::$_delimiter).self::$_delimiter;
    }

    public static function getDelimiter()
    {
        return self::$_delimiter;
    }

    public static function setDelimiter($delimiter)
    {
        self::$_delimiter = $delimiter;
    }

    public static function match($string, $pattern)
    {
        preg_match_all(self::_normalize($pattern), $string, $matches, PREG_PATTERN_ORDER);
        if(!empty($matches[1]))
        {
            return $matches[1];
        }
        if(!empty($matches[0]))
        {
            return $matches[0];
        }

        return null;
    }

    public static function split($string, $pattern, $limit = null)
    {
        $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_NO_EMPTY;
        return preg_split(self::_normalize($pattern), $string, $limit, $flags);
    }

}

我的问题是 $_delimiter 是做什么用的?它在 $_normalization 函数中的用途是什么。是否与我不太熟悉的正则表达式有关,除了它是用于匹配字符串部分的自定义模式这一事实。

书的解释如下:

$delimiter 和 _normalize() 成员都是用于正则表达式字符串的规范化,以便剩余的方法可以对它们进行操作,而无需先对其进行检查或规范化。match() 和 split() 方法的执行类似于 preg_match_all() 和 preg_split() 函数,但对正则表达式的正式结构要求较低,并返回一组更可预测的结果。match() 方法将返回第一个捕获的子字符串、整个子字符串匹配或 null。split() 方法将在设置一些标志和规范化正则表达式之后返回调用 preg_split() 函数的结果。

我在这里先向您的帮助表示感谢。

4

2 回答 2

4

看来 normalize 函数正在手动将模式分隔符添加到正则表达式模式中。该代码使用哈希“#”字符。normalize 函数去除可能已经是开始和结束的任何哈希字符,然后添加分隔符。正常的模式分隔符是正斜杠“/”(即/your[reg]ex[here]/

最终结果是,如果您键入并不重要

your[reg]ex[here]

或者

#your[reg]ex[here]#

两种模式都可以正常工作。

于 2013-05-31T01:42:02.070 回答
0

PHP 中的 PCRE 函数都要求正则表达式以匹配的分隔符开始和结束,以便可以在第二个分隔符之后放置可选的修饰符,例如

preg_match('/foo/i', $string);

在这种情况下,分隔符是/字符,i是修饰符。

您的类允许您将正则表达式包装在分隔符中,但不需要它。$delimiter是它希望您用作分隔符的字符。_normalize如果分隔符不存在,该方法将在调用之前添加分隔符preg_match()。它通过调用trim($pattern, $self::$delimiter)删除分隔符(如果它们已经存在)来实现这一点,然后在每一端连接分隔符。

于 2013-05-31T01:42:17.120 回答