0

これは非常に単純であるため、明らかな何かが欠けていることは確かですが、ここに私が直面している問題があります。

Web サイトをスクレイピングする際に、次のような形式のリンクをいくつか引っ張っています。

<a href="/test.php?var1=123&var2=456&var3=789">SomeString</a>

場合によっては、リンクの一部が次のようになります。

<a href="/test.php?var1=123&var2=456&var3=789" title="sometitle">SomeString</a>

次のような正規表現を使用すると機能しますが、望ましくない一致が追加されます。

'/<a href=\"/test.php\?var1=([0-9]+)&var2=([0-9]+)&var3=([0-9]+)\"(^.*?)>(^.*?)<\/a>'

したがって、明らかに、ここでは望ましくない一致が得られますが、「タイトル」変数が表示される可能性が考慮されています。preg_match_all() に「ここに何かがあるかもしれませんが、無視する必要があります」と伝える方法はありますか、それが見つかった場合は一致しますか?

ありがとう。

明確ではなかったため、編集します。

私の元の例では、var1、var2、var3 が何に等しいか、および と の間のテキスト (私の例では SomeString) を調べたいと考えています。多くの結果を含むページを通過している場合、文字列内に「title =」が含まれていることがあり、正規表現が無効になります。だから、「ここにあるかもしれないが、一致しない、無視してください」と伝えたいのです。

4

4 に答える 4

0

?または*文字を使用できます。?貪欲ではないと言われていますが、私はそれを単に「オプション」と考えています。*「ゼロ以上」に一致します。

正規表現を次のように変更する必要があります

'/<a href=\"/test.php?var1=([0-9]+)&var2=([0-9]+)&var3=([0-9]+)\"(^.*?)?>(^.*?)<\/a>'
                                                                       ^

また

'/<a href=\"/test.php?var1=([0-9]+)&var2=([0-9]+)&var3=([0-9]+)\"(^.*?)*>(^.*?)<\/a>'
                                                                       ^

についてのビットをグループ化したくない場合は、正規表現でtitle="something"使用してキャプチャを回避でき(?:)ます。それで

'/<a href=\"/test.php?var1=([0-9]+)&var2=([0-9]+)&var3=([0-9]+)\"(?:^.*?)*>(^.*?)<\/a>'
                                                                 ^^^^^^^^^
于 2013-07-31T13:16:37.530 に答える