preg_match завершается ошибкой при добавлении скобок - PullRequest
0 голосов
/ 05 сентября 2011

ниже приведено упрощение регулярного выражения, которое я использую. на моей машине разработки и $pattern1 и $pattern2 возвращают совпадение, однако на моей производственной машине только $pattern1 возвращает совпадение! очевидно, единственное различие между $pattern1 и $pattern2 состоит в том, что у одного из них есть квадратные скобки вокруг слова. однако оба являются допустимыми шаблонами, которые должны соответствовать данному стогу сена (насколько я знаю).

$pattern1 = '/\<a name="ERROR TEXT"\>\<\/a\>\s*?validated\s*?\<\/span\>\s*?\<\/h1\>/';
$pattern2 = '/\<a name="ERROR TEXT"\>\<\/a\>\s*?(validated)\s*?\<\/span\>\s*?\<\/h1\>/';
$haystack = '- IFCS msg value, BOOKMARKED AS ERROR TEXT -->
          <a name="ERROR TEXT"></a>
             validated</span>
       </h1>

                <!-- START: .formActionHolder -->
                <div class="formActionHolder">';
preg_match($pattern1, $haystack, $matches);
print_r($matches);

кто-нибудь раньше обнаруживал эту проблему? обратите внимание, что это не все регулярные выражения - это упрощенная версия, которую я определил как проблему. в моем реальном коде значение 'validated' не является константой, поэтому я использую квадратные скобки для захвата слова. Конечно, в шаблонах есть и другие символы в скобках, так что я могу захватить здесь переменные слова. это просто упрощенный пример, который оттачивает проблему, с которой я сталкиваюсь, с двумя, казалось бы, хорошими регулярными выражениями.

на моей машине для разработки я использую php5.3.2 с библиотекой pcre 7.8, а на своей рабочей машине я использую php5.2.4 с pcre 7.4.

Ответы [ 3 ]

0 голосов
/ 05 сентября 2011

вы уверены, что $ pattern2 cound не совпадает?В моем затмении оно соответствует, покажите массив ([0] => проверено [1] => подтверждено)

0 голосов
/ 06 сентября 2011

У меня была мысль о комбинации ?( в $pattern2, поэтому я удалил ?, чтобы сделать

$pattern = '/\<a name="ERROR TEXT"\>\<\/a\>\s*(validated)\s*?\<\/span\>\s*?\<\/h1\>/';

и это работает !! это очень странно - возможно, даже ошибка?

похоже, что бит ?(validated) интерпретировался как условный подшаблон, а не как вопросительный знак, используемый для создания \s* несвязным

это не похоже на правильное поведение для меня.

ну хорошо ... это немного больно, так как теперь мой * будет жадным. шаблон регулярных выражений делает то, что я хочу в этом случае, хотя ...

спасибо за все ваши полезные комментарии!

0 голосов
/ 05 сентября 2011

Скобки используются для группировки в регулярных выражениях php и действуют так, если только вы не избегаете их, чтобы заставить их действовать как сами персонажи.

...