2010-04-07 3 views
1
$regexp = '/(?:<input\stype="hidden"\sname="){1}([a-zA-Z0-9]*)(?:"\svalue="1"\s\/>)/'; 
$response = '<input type="hidden" name="7d37dddd0eb2c85b8d394ef36b35f54f" value="1" />'; 
preg_match($regexp, $response, $matches); 

echo $matches[1]; // Outputs: 7d37dddd0eb2c85b8d394ef36b35f54f 

Так что я использую это регулярное выражение для поиска токена аутентификации на веб-странице, реализующей Joomla, для того, чтобы заготовить скриптовый логин.Ошибочные совпадения с регулярным выражением

У меня все это работает, но мне интересно, что не так с моим регулярным выражением, поскольку оно всегда возвращает 2 элемента.

Array ([0] => [1] => 7d37dddd0eb2c85b8d394ef36b35f54f) 

Также имя ввода, которое я проверяю на изменение каждой загрузки страницы как по длине, так и по имени.

ответ

3

Ничего не то. Пункт [0] всегда содержит весь матч. Из the docs (курсив мой):

matches Если предусмотрено, то заполнен результатами поиска. $matches[0] будет содержать текст, который соответствовал полному шаблону, $matches[1] будет иметь текст, соответствующий первого захваченный подшаблона скобки, и так далее.

Ваше регулярное выражение (с учетом того факта, что вы работаете с HTML с регулярными выражениями, в котором вы знаете, что вы не должны) является слишком сложным.

$regexp = '#<input\s+type="hidden"\s+name="([0-9a-f]*)"\s+value="1"\s*/>#i' 
  • Вам не нужны, не захватив группы вообще.
  • Вы используете \s, что ограничивает вас одним персонажем. \s+, вероятно, лучше.
  • Использование чего-то другого, отличного от /, поскольку граница регулярного выражения делает ненужным переключение косых черт в регулярном выражении.
  • Создание регулярного выражения без учета регистра может быть полезным.
  • Значок auth выглядит как шестнадцатеричная строка, поэтому сопоставление a-z не нужно.
+0

Спасибо. Ваше регулярное выражение кажется более легким для чтения, и я знаю, что вы не должны выполнять html-сопоставление с регулярным выражением, но это казалось для него отличным случаем. – Ballsacian1

+0

@ Ballsacian1: Это ваши похороны. ;-) Взгляд в DOMDocument :: loadHTML и решение этой проблемы с DOM и XPath, возможно, стоит того. – Tomalak

0

В соответствии с ручным вводом для preg_match:

Если совпадения предусмотрено, то он заполнен результатами поиска. $ matches [0] будет содержать текст, сопоставляемый с полным шаблоном, $ matches [1] будет иметь текст, который соответствует первому захваченному подшаблону в скобках и т. д.

+1

И я предполагаю, что '[0] => [1]' в действительности (в источнике веб-страницы) '[0] =>«<тип = "скрытый" Name = "7d37dddd0eb2c85b8d394ef36b35f54f" входное значение =» 1 "/> '[1] =>' – Arkh

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