Отпарсить динамические значения формы

Статус
В этой теме нельзя размещать новые ответы.

HalliK

Постоялец
Регистрация
4 Фев 2007
Сообщения
120
Реакции
169
В форме присутствует много input'ов, где связки параметр=значение плавающие, т.е. меняютсвое положение в описании input'а:
1)<input type="hidden" name="hash" value="значение" />
2)<input value="значение" type="hidden" name="hash" />
3)<input type="hidden" value="значение" name="hash" />
и т.д.
Какой регуляркой вытянуть значения name и value?
 
Код:
<input\b
(?=[^>]+?\bname="([^"]*)")
(?=[^>]+?\bvalue="([^"]*)")
 
Спасибо огромное! Помогло, если несложно объясни что тут что обозначает? Запутался, от мануалов уже голова пухнет :)
 
(?= ... ) - Опережающая проверка. Все, что внутри действует как и обычная регулярка, но не включается в совпадение. Т.е. по выходе из скобок, дальнейший поиск продолжается с того же места.
[^>]- совпадение с любым символом, кроме '>'
+? - модификатор, означающий что [^>] повторяется от одного и более раз.
Этот модификатор не жадного типа (знак ? в нем), т.е. он старается захватить как можно меньше символов, в противоположность жадному модификатору +, который захватыват по максим ому.
[^"]* модификатор * означает ноль или более раз, модификатор жадный.
( ) - сохраняющие скобки, для сохранения значений
\b означает границу слова, поставлен на всякий случай, по привычке. Если бы допустим мы искали тег <i>, то без символа \b выражение /<i/ также совпало с <input, и другими тегами на i.
 
Если можно, полностью паттерн для данного примера

Сделал Вот таким образом
PHP:
$pattern = '|<input\b (?=[^>]+?\b name="([^"]*)")(?=[^>]+?\b value="([^"]*)")|is'; 
preg_match_all($pattern, $content, $array); 
echo "Значения"; 
echo "<pre>"; 
print_r($array[2]); 
echo "</pre>";  
}

выдает пустой массив:nezn:

И еще один вопрос, если парсить форму, можно ли выдергивать
action и input одной регуляркой?
 
rex1963
У тебя в регулярке есть дополнительные пробелы, поэтому надо либо их удалить, либо использовать регулярку с модификатором x.
Код:
|<input\b (?=[^>]+?\b name="([^"]*)")(?=[^>]+?\b value="([^"]*)")|ix
И еще один вопрос, если парсить форму, можно ли выдергивать
action и input одной регуляркой?
Смотря что имеется ввиду
 
Пример
PHP:
<?
//гружу страницу с формой
$content=file_get_contents("http://eee/com");
//вытаскиваю action
preg_match_all('~<form.+action\s?=\s?(\'|"|)([^\s>]+)\1(\s|>)[^>]*~Ui', $content, $m);
echo "Значения"; 
echo "<pre>"; 
print_r($m[2]); 
echo "</pre>"; 
//затем тащу поля
$pattern = '|<input\b (?=[^>]+?\b name="([^"]*)")(?=[^>]+?\b value="([^"]*)")|ix'; 
preg_match_all($pattern, $contents, $array); 
echo "Значения"; 
echo "<pre>"; 
print_r($array[2]); 
echo "</pre>";  
}
?>
Как все это сделать одним выражением и раскидать в массив:
form- action=>value
input- name=>value
textarea - name=>value

Вообще при парсинге формы как следует поступать
например, поля input- name без value, их отдельно надо описывать регуляркой или как?
Типа:
1 выражение тянет action=>value из формы
2 выражение input- name без value
3 выражение input- name=>value
4 выражение textarea - name=>value

Или можно все собрать в один паттерн?
 
  • Нравится
Реакции: L_D
Не очень понял зачем, но собрать в один паттерн можно. Примерно так
Код:
(?six)
(?:
<form\b[^>]+?\baction\s*=\s*(?:"(?<action>[^"]*)"|'(?<action>[^']*)'|(?<action>[^\s'"<>]+))
|
<input\b
(?=[^>]+?\bname="(?<name>[^"]*)")
(?:[^>]+?\bvalue="(?<value>[^"]*)")?
|
<textarea\b[^>]+?name\s*=\s*"(?<name>[^"]*)"[^"]*>(?<value>.*?)</textarea\s*>
)
 
Здравствуйте, для подобной цели мне подошел паттерн
PHP:
$pattern = '|<input\b (?=[^>]+?\b name\=\"(.*)\")(?=[^>]+?\b value="([^"]*)")|Uix';
Но у некоторых целевых инпутов отсутствуют value. При этом name у таких тоже теряется. Как бы подправить, чтобы - если нет value, записывать name и оставлять значение value для него пустым?
 
Не пробовали искать готовые решения для парсинга форм, я имею у себя целый класс.
 
  • Нравится
Реакции: L_D
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху