规范化正则表达式字符串

时间:2013-05-31 01:34:22

标签: php string expression

我一直在读一本名为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()函数。

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

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

最终结果是,如果键入

,则无关紧要
your[reg]ex[here]

#your[reg]ex[here]#

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

答案 1 :(得分:0)

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

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

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

您的类允许您将regexp包装在分隔符中,但不需要它。 $delimiter是您希望将其用作分隔符的字符。 _normalize方法会在调用preg_match()之前添加分隔符(如果它们尚未存在)。它通过调用trim($pattern, $self::$delimiter)来删除分隔符(如果它们已经存在),然后在每一端连接分隔符来完成此操作。