Ошибочные совпадения с регулярным выражением - PullRequest
1 голос
/ 07 апреля 2010
$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)

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

Ответы [ 2 ]

3 голосов
/ 07 апреля 2010

Нет ничего плохого. Элемент [0] всегда содержит все совпадения. От документы (выделено мое):

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

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

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

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

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

...