0

PHPの正規表現関数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

確かに、この試合を2つのフェーズに分割します。

  1. 関連する入力要素を見つける
  2. 値を取得

要素内の属性の順序がどうなるかわからないためです。

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

そしてもちろん、html / xmlの解析については、常に正規表現を考慮DOMしてください。DOMXpath

于 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

主な間違いは関数の使用でしたpreg_replace、魔女は主題を返します-一致したパターンも置換もありません。あなたのアイデアとDOMDocumentの推薦に感謝します。m93a

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

于 2013-03-12T19:03:46.120 に答える