2012-06-27 3 views
0

У меня проблема с функцией regexp, preg_replace(), в PHP. Я хочу получить viewstate из ввода html, но он не работает должным образом.PHP preg_replace();

Этот код:

$viewstate = preg_replace('/^(.*)(<input\s+id="__VIEWSTATE"\s+type="hidden"\s+value=")(.*[^"])("\s+name="__VIEWSTATE">)(.*)$/u','^\${3}$',$html); 

возвращает это:

%0D%0A%0D%0A%3C%21DOCTYPE+html+PUBLIC+%22-%2F%2FW3C%2F%2FDTD+XHTML+1.0+Transitional%2F%2FEN%22+%22http%3A%2F%2Fwww.w3.org%2FTR%2Fxhtml1%2FDTD%2Fxhtml1-transitional.dtd%22%3E%0D%0A%0D%0A%3Chtml+xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22+%3E%0D%0A%3Chead%3E%3Ctitle%3E%0D%0A%09Strava.cz%0D%0A%3C%2Ftitle%3E%3Clink+rel%3D%22shortcut+icon%22+href%3D%22..%2FGrafika%2Ffavicon.ico%22+type%3D%22image%2Fx-icon%22+%2F%3E%3Clink+rel%3D%22stylesheet%22+type%3D%22text%2Fcss%22+media%3D%22screen%22+href%3D%22..%2FStyly%2FZaklad.css%22+%2F%3E%0D%0A++++%3Cstyle+type%3D%22text%2Fcss%22%3E%0D%0A++++++++.style1%0D%0A++++++++%7B%0D%0A++++++++++++width%3A+47px%3B%0D%0A++++++++%7D%0D%0A++++++++.style2%0D%0A++++++++%7B%0D%0A++++++++++++width%3A+64px%3B%0D%0A++++++++%7D%0D%0A++++%3C%2Fstyle%3E%0D%0A%0D%0A%3Cscript+type%3D%22text%2Fjavascript%22%3E%0D%0A%0D%0A++var+_gaq+%3D+_gaq+%7C%7C+%5B%5D%3B%0D%0A++_gaq.push%28%5B 

EDIT: К сожалению, я оставил этот вопрос в течение длительного времени. Наконец я использовал DOMDocument.

+0

возможно дубликат [спичечных RegEx открытых тегов, кроме XHTML автономных тегов] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self -контейнер-теги) – Amber

+0

Я только хочу знать, почему он не работает :( – m93a

ответ

1

Вы должны снимать, только когда планируете использовать данные. Таким образом, большинство() устарели в этом шаблоне регулярного выражения. Не причина для неудачи, но я думал, что упомянул об этом.

Вместо того чтобы использовать [^ "], чтобы отметить, что вы не хотите, чтобы этот символ вы могли использовать не-жадный модификатор - ?. Это гарантирует, что шаблон подходит как можно меньше. Поскольку у вас есть name="__VIEWSTATE" .. значение это должно быть безопасным

Давайте поставим это на практике и упростить рисунок на некотором Это работает, как вы хотите:.

'/.*<input\s+id="__VIEWSTATE"\s+type="hidden"\s+value="(.+?)"\s+name="__VIEWSTATE">.*/' 

Я бы strongly recommend проверить an alternative to regexp для операций DOM Это делает определенный код работает также, если атрибуты меняют порядок. с нами так приятно работать.

+0

Он по-прежнему не работает - я найду альтернативный способ. Спасибо :) – m93a

2

Чтобы быть уверенным, я бы разделить этот матч на два этапа:

  1. Найти соответствующий элемент ввода
  2. Получить значение

Потому что вы не можете быть уверены, что заказ атрибуты в элемент будет.

if(preg_match('/<input[^>]+name="__VIEWSTATE"[^>]*>/i', $input, $match)) 
    $value = preg_replace('/.*value="([^"]*)".*/i', '$1', $match[0]); 

И, конечно же, всегда считаю DOM и DOMXpath над регулярным выражением для разбора HTML/XML.

+0

Я могу быть уверен, потому что ценность - это единственное, что изменения :) Но спасибо. – m93a