2

私は PHP は得意ですが (専門家とは言えません)、正規表現とスクレイピングに関してはまったくの初心者です。調査を支援し、自分自身を教育するために、少しスクレイピングを行いたかったのですが、問題が発生しました。ページの次の部分から賞品を抽出したい:

<th valign="top"> Prize pool:
</th>
<td> $75,000
</td></tr>

言うまでもなく、賞金プールの値は変わります。賞金を獲得したいのですが、この部分からの賞金だけです (この例では、スクリプトは $75,000 を出力する必要があります)。

これは私がこれまでに持っているものです:

preg_match('/Prize pool:\n<\/th>\n<td>(.*)/i', $file_string, $prize);

ただし、これは次のように出力されます。

Prize pool:
</th> 
<td> $75,000
4

3 に答える 3

1
preg_match('/Prize pool:.+(\$\d+(?:\.|,)\d+)/is', $file_string, $prize);
echo '<pre>' . print_r($prize, 1) . '</pre>';

このような。

少し説明

.- 任意の 1 文字を検索しますが、改行文字 "\n" は検索しません

+- 1 回以上の繰り返しを意味します

したがって、.+「賞金プール:」の後に任意の文字が複数ある必要があることを意味します

(...)ポケットといいます。正規表現の各ポケットは、配列の各要素に配置されます ( $prize)

$in patter は行末を意味するため、このようにエスケープして単一の文字に変換する必要があります\$

\d- は 0 から 9 までの 1 つの数字を意味し、\d+ は 1 つ以上の数字を意味します。

(?:...)これもポケットですが、$prize には保存されません。後で使用?:したためです。(

私たちが知って.いるように、任意の単一の文字であるため、ドットに変換するには、エスケープする必要があり\.ます。\.|,.,

/here pattern/iここでの修飾子iは、正規表現が大文字と小文字を区別しないことを意味します

/here pattern/smodificatorsは、メタ.文字に改行文字が含まれることを意味します。

于 2013-02-25T13:28:23.770 に答える
0

Prize pool:\s*<\/th>\s*<td>\s+(.*)\s+<\/td>

HTML を解析してこの値のみを取得する場合は、正規表現を使用してください。HTML 文字列から数値を取得するために完全な HTML パーサーを使用する必要はありません。

Rubularを使用して正規表現をテストします。

于 2013-02-25T13:03:27.837 に答える
0
$reg = '~Prize pool:.*?td>\s*(.*?)\s*<~';

紅斑デモ

于 2013-02-25T13:06:38.553 に答える