2

正規表現とPHPを使用して、次のようにtitle属性のコンテンツを取得しようとしています。

preg_match('/<abbr class="dtstart" title="([^"]*)"/i', $file_string, $starts);
$starts_out = $starts[1];

preg_match('/<abbr class="dtend" title="([^"]*)"/i', $file_string, $ends);
$ends_out = $ends[1];

これが私が取得したいコードの正確な部分であり、データを正しく取得します。

<div id="eventDetailInfo">
    <h2>When</h2>
    <div class="p">
        <div>From:
            <abbr class="dtstart" title="2012-08-24T17:00:00">Friday, August 24th, 2012</abbr></div>
        <div>Until:
            <abbr class="dtend" title="2012-08-26">Saturday, August 25th, 2012</abbr></div>
    </div>
</div>

ただし、一部の記事にはUntilがない場合があるため、正規表現は残りのコードの最初のコードと一致します(これは関連記事です)。

私の質問は、上記のみに一致するように正規表現を制限するにはどうすればよいですか?

<div>Until:
                <abbr class="dtend" title="2012-08-26">Saturday, August 25th, 2012</abbr></div>

空白のままにすることが見つかりましたか?

これはページの残りのコードですが、残念ながら正規表現はそれに一致します。

<div class="evdate">
    <em>When:</em>
    <abbr class="dtstart" title="2012-07-03T21:00:00">July 3rd</abbr>
    to
    <abbr class="dtend" title="2012-07-13">July 12th</abbr>*
</div>
<div class="evtime"><em>Time:
    </em>
    21:00
</div>
</div>
4

2 に答える 2

1

HTML の照合に正規表現を使用しないことについては他の意見に同意しますが、個人的には、何を取得できるかを正確に知る必要がある場合は、正規表現が非常に役立つと思います。さまざまなソースのスクレイピング負荷を除いて、DOM フレームワークが提供する一貫性は必要ないことがよくあります。

とにかく、あなたの質問を考えると、DOMが必ずしも役立つとは思わないので、特定のクラス/パターン内からのみピックアップするように設計する必要があります。これを行う方法は、正規表現を拡張して、必要なものだけでなく、含まれているコンテンツにも一致させることです。そのため、関連する記事と一致しないように、パターン内に一意のものを含める必要があります。(少し簡単ですが、DOM で行う必要があるのと同じです!)

于 2012-07-31T18:14:29.143 に答える
0

簡単な regexを使用してこれを行う方法を示しましたが、この種のことに正規表現を使用しないように明確にアドバイスしました。ご覧のとおり、すぐに手に負えなくなる可能性があります。

他の人 (あちこち) が指摘しているように、これには HTML パーサーを使用する必要があります。


Simple HTML DOMを使用することをお勧めします。これは、操作が非常に簡単で、ドキュメントも非常に優れているためです。

于 2012-07-31T17:21:55.363 に答える