0

我在 PHP 中遇到了 regexp 函数 preg_replace() 的问题。我想从 html 的输入中获取视图状态,但它不能正常工作。

这段代码:

$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

编辑:对不起,我把这个问题留了很长时间。最后我使用了 DOMDocument。

4

3 回答 3

2

为了确保我将这场比赛分为两个阶段:

  1. 找到相关的输入元素
  2. 获取价值

因为您无法确定元素中的属性顺序是什么。

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

当然,在解析 html/xml 时,一定要考虑使用正DOMDOMXpath表达式。

于 2012-06-27T08:08:22.350 回答
1

您应该只在计划使用数据时进行捕获。所以大多数 () 在那个正则表达式模式中已经过时了。不是失败的原因,但我想我会提到它。

而不是使用 [^"] 来标记您不想要该字符,您可以使用非贪婪修饰符 - ?。这可以确保模式尽可能少地匹配。由于您name="__VIEWSTATE"遵循该值,因此这应该是安全的.

让我们将其付诸实践并简化一些模式。这可以按您的意愿工作:

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

强烈建议检查DOM 操作的正则表达式的替代方法。如果属性更改顺序,这可以确保您的代码也可以正常工作。另外,它的工作要好得多。

于 2012-06-27T07:48:18.317 回答
0

主要错误是使用 funciton preg_replace,witch 返回主题 - 既不是匹配模式也不是替换。感谢您的想法和 DOMDocument 的推荐。m93a

http://www.php.net/manual/en/function.preg-replace.php#refsect1-function.preg-replace-returnvalues

于 2013-03-12T19:03:46.120 回答