2013-05-31 6 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

Кажется, что функция normalize добавляет разделитель шаблонов вручную к шаблону регулярных выражений. Код использует хэш-символ «#». Функция normalize выполняет разделение любых хеш-символов, которые могут уже начинаться и заканчиваться, а затем добавляет разделители. Нормальный шаблон разделитель слэш «/» (т.е. /your[reg]ex[here]/)

Конечным результатом является то, что не имеет значения, если вы наберете

your[reg]ex[here] 

или

#your[reg]ex[here]# 

Обе модели будут работать хорошо.

0

Функции PCRE на PHP требуют, чтобы регулярное выражение начиналось и заканчивалось соответствующими символами-разделителями, так что необязательные модификаторы могут быть помещены после второго разделителя, например.

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

Разделители в этом случае являются / символов и i является модификатором.

Ваш класс позволяет обернуть регулярное выражение в разделителях, но не требует его. $delimiter - символ, который он ожидает от вас в качестве разделителей. Метод _normalize добавит разделители, если они еще не были там, перед вызовом preg_match(). Он делает это, вызывая trim($pattern, $self::$delimiter), чтобы удалить разделители, если они уже существуют, и затем объединить разделители с каждого конца.

Смежные вопросы