2013-05-31 22 views
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函数中有什么用途。这是否与我不熟悉的正则表达式有关,因为它是用于匹配字符串部分的自定义模式。

这本书的解释如下:

的$分界和_normalize()成员全部为正则表达式的字符串的正常化,使剩余的方法可以对它们进行操作,而不必首先检查或正常化他们。 match()和split()方法的执行类似于preg_match_all()和preg_split()函数,但是对正则表达式要求更少的形式化结构,并返回更可预测的结果集合。 match()方法将返回第一个捕获的子字符串,整个子字符串匹配或null。在设置了一些标志并规范化正则表达式之后,split()方法将返回调用preg_split()函数的结果 。

感谢您的帮助提前。

回答

4

看来标准化函数会将模式分隔符手动添加到正则表达式模式。代码使用散列“#”字符。标准化功能可以去除任何可能已经开始和结束的散列字符,然后再添加分隔符。正常模式分隔符是正斜杠“/”(即/your[reg]ex[here]/

最终的结果是,如果你键入

your[reg]ex[here] 

#your[reg]ex[here]# 

两个模式都将工作也没关系精细。

0

PHP中的PCRE函数都要求正则表达式的开始和结尾都带有匹配的分隔符,以便可以在第二个分隔符后面加上可选的修饰符,例如,

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

在这种情况下的分隔符是/字符,i是改性剂。

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