繁体   English   中英

规范化正则表达式字符串

[英]Normalizing Regular Expression String

我一直在阅读有关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()函数。

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

看来规范化功能正在手动将模式定界符添加到正则表达式模式。 该代码使用井号“#”。 规范化功能会剥离可能已经开始和结束的所有哈希字符,然后将分隔符添加回去。 普通模式定界符为正斜杠“ /”(即/your[reg]ex[here]/

最终结果是您键入是否无关紧要

your[reg]ex[here]

要么

#your[reg]ex[here]#

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM