1

PHP と preg_match を使用して、複数行のパターンから値を抽出しようとしています。preg_match($regex, $string, $the_match) に渡す文字列内で検索しているパターン:

Latitude:</td>
        <td class="formCell">
        40-45-40.205 N
       </tr>

次のようにすべてが1行にある場合、私はそれを知っています:

Latitude:</td><td class="formCell">40-45-40.205 N</tr>

次に、以下が有効になり、値を適切に抽出します。

/Latitude:<\/td><td class="formCell">(.*?)<\/tr>/

ただし、探しているパターンには複数の行があるため、上記の正規表現は機能しません。file_get_contents($url) を介して preg_match() に渡す初期文字列を取得しているので、リモートコンテンツにある程度翻弄されています。どんな助けでも大歓迎です!

4

3 に答える 3

5

[\s\S]の代わりに使用してください.

/Latitude:<\/td>[\s]*<td class="formCell">([\s\S]*?)<\/tr>/

.はワイルドカードですが、空白(改行を含む)文字は含まれません。[\s\S]単に「すべてのスペース文字と非スペース文字に一致する」と言います。

注。の後のオプションのスペース文字も許可しました</td>

(補足:HTMLは無効です-テーブルセルを閉じる前にテーブル行を閉じます。)

于 2012-07-05T22:38:31.383 に答える
0

これには単純なフラグはありません。簡単なハックは次のようになります。

Latitude:(.*?)<\/td>(.*?)<td class="formCell">(.*?)<\/tr>

そして、 dotall フラグを正規表現に追加して、「.」[ドット] が改行にも一致するようにします。しかし、それはもっと多くの一致する可能性があります。それはあなた自身のコードですか、それともサードパーティの Web サイトから HTML をリッピングしていますか? 必要のないときに正規表現を使用している可能性があるためです。

于 2012-07-05T22:38:16.290 に答える
0

[\s]*秘訣は、HTML 形式で合法的に空白を許可する場所に「振りかける」ことだと思います。特別なフラグなどは必要ありません。

Latitude:[\s]*<\/td>[\s]*<td[\s]*class="formCell">[\s]*([\s\S]*?)[\s]*<\/tr>

html は空白について非常に寛大であることに注意してください。入力内容を評価し、許容範囲を決定する必要があります。

もう1つの注意点は、これらの要素には異なる属性または異なる引用スタイルがある可能性があることです...それも使用する必要がある場合は、さらに多くの.フラグを使用してから、「未準備」フラグを使用する必要があります(uパターンを渡すときにパターンの後に追加します) preg 関数へ); そして、> が属性内で合法的に発生する可能性があることに気付いたら、おそらくいくつかの派手な後方参照 ;-)

于 2012-07-05T23:00:21.723 に答える