0

HTMLで値を検索するための正しい正規表現を書き込もうとしていますが、いくつか問題があります。

HTMLの一部があります:

<div class="inner">
<div class="title">Processing 3-D Secure Transaction</div>
<form autocomplete="off" name="PAResForm" id="PAResForm" action="https://www.alfaportal.ru/" method="POST">
<input name="MD" type="hidden" value="4326381105C3B67B2823E71FD235FFD2"><input value="eJzVWFmvo0iy/iulnkerm9UYt1xdQtJ2pkQdOVw5AW2qGv+is66Q
qrz9LBZ3mCe7mJzYARdloC1dJ/Lk+nQ7KBxxdgtIEgy/Tp/I93MZ5NtZzfdTnPdj5vfz7tex6I/n
4P8DRkGf4Q==" name="PaRes" type="hidden"> 

文字列を検索しようとしています

<input name="MD" type="hidden" value="4326381105C3B67B2823E71FD235FFD2">

そして価値を得る

問題は、値と名前が互いに置き換えられる可能性があることです。たとえば

<input value="4326381105C3B67B2823E71FD235FFD2" type="hidden" name="MD">

私は正規表現パターンを書きました:

<input.*name=\"MD\"|value=\"([^<>]*?)\"[^<>]*value=\"([^<>]*?)\"|name=\"MD\".*?>

一部のオンライン正規表現サービスでは機能しますが、実際の Java では機能しません。

正しく変更してください。

また、テスト用の簡単なコマンドライン ツールも作成しました。http://pastebin.com/Pzynqrn8

4

7 に答える 7

2

HTML 解析用のツールはたくさんあります。それらを無視してはいけないと思います。ここで 議論 された.

于 2013-10-21T08:29:59.273 に答える
2

私は次のようなことを試してみると思います:

<input\s*?(value=['"].*?['"]\s*)|(type=['"].*?["']\s*)|(name=['"].*?['"]\s*)\>
于 2013-10-21T08:24:39.047 に答える
2

Java でそれを行う方法はわかりませんが、適切なドキュメント オブジェクト モデル ツールなどを使用することを強くお勧めします。

PHP では、次のようにします。

$xml = new DomDocument();
$xml->loadXml($yourHTMLHere);
$xpath = new DOMXPath($xml);
$node = $xpath
    ->evaluate('//form[@name="PAResForm"]//input[@name="MD"]')
    ->item(0);
$yourValueIsHere = $node->getAttribute('value');

5 行、完全に読みやすく、属性の順序は気にしません。Java は確かに同じことを行うことができます。適切なクラスを検索するだけです。

また、正規表現で不規則な言語を解析しないでください。Html は通常の言語ではありません。

于 2013-10-21T08:40:29.757 に答える
1

いつものように、いつものように、HTML を処理するときはいつでも: パーサーを使用してください。正規表現は、よく知られている投稿で死に至るまで説明された技術的な理由により、そのタスクに対応していません。

Java にはjSoupがあり、必要なことを正確に実行する小さくてシンプルで保守可能なコードを驚くほど簡単に作成できます。

Document doc = Jsoup.parse(str);
Element input = doc.select("input[name='MD']").first();

if (input != null) {
    String value = input.attr("value");
    // now do something with it
}

ここで、この 3 ライナーをすべての毛むくじゃらの正規表現の回答と比較し、それらがどれほど維持できず安全でないか、どれだけの説明が必要か、HTML が変更されたときにそれらをゼロから完全に書き直す方法を考えてください。自分で解決策を見つけようとした時間を数えて、HTML に関して正規表現が価値があるかどうかを判断してください。

于 2013-10-21T14:16:16.360 に答える
-1

最後に、別のパターンを追加してこれを解決しました。最初は<input ... name='MD' ... />パターンのような文字列を探し".*?(<input[^<>]*name=\\\"MD\\\"[^<>]*>).*?"ています。その後、結果文字列の値をパターンで探しています".*?value=\\\"(.*?)\\\""

みんな助けてくれてありがとう

于 2013-10-21T10:15:57.970 に答える