preg_match с именем, являющимся последним во вводе - PullRequest
0 голосов
/ 15 октября 2011

Я пытаюсь получить значение из поля ввода, но имя имени является последним.

<input value="joe" type="hidden" name="firstname">

preg_match('/input value="(.*?)" type="hidden" name="firstname"/', $request, $firstname);

Это то, что я делаю, но это не работает .. Кто-нибудь знает, как это исправить?

Ответы [ 4 ]

1 голос
/ 15 октября 2011

После того, как вы определили <input …>, вы можете использовать следующий шаблон для извлечения всех атрибутов (заботясь о разделителях значений (одинарные кавычки, двойные кавычки, пробел)).

<?php

$input = '<input value="joe" type="hidden" name="firstname">';
$attributes = array();
$pattern = "/\s+(?<name>[a-z0-9-]+)=(((?<quotes>['\"])(?<value>.*?)\k<quotes>)|(?<value2>[^'\" ]+))/i";
if (preg_match_all($pattern, $input, $matches, PREG_SET_ORDER)) {
  $attributes[$match['name']] = $match['value'] ?: $match['value2'];
}
var_dump($input, $attributes);

приведет к

$attributes = array(
    'value' => 'joe',
    'type' => 'hidden',
    'name' => 'firstname',
)

https://gist.github.com/1289335

0 голосов
/ 15 октября 2011

ваше регулярное выражение в порядке последний аргумент preg_match возвращает массив

элемент 0 = весь матч

элемент 1 = первое совпадение скобок

$request = '<input value="joe" type="hidden" name="firstname">';

if (preg_match('/input value="(.*?)" type="hidden" name="firstname"/', $request, $matches)) {
    echo "MATCHED: ", $matches[1];
} 
0 голосов
/ 15 октября 2011

Убедитесь, что параметры <input> отображаются в указанном порядке в источнике . Обратите внимание, что они появляются в произвольном порядке, если вы посмотрите на них, например, с помощью firebug.

Попробуйте заменить жестко закодированные пробелы '' на '\s+' для повышения надежности.

0 голосов
/ 15 октября 2011

Попробуйте это регулярное выражение

input(.*)?(name=\"(\w+)\")(.*)?

и получите 3-й результат

...