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>

但是,因为有时在某些文章中没有直到,正则表达式匹配剩余代码中的第一个(这是相关文章)。

我的问题是如何将正则表达式限制为仅匹配上述内容,如果没有

<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

虽然我已经向您展示了如何使用快速正则表达式来做到这一点,但我明确建议您不要将正则表达式用于此类事情。正如您自己所看到的,它很快就会失控。

正如其他人(在这里和那里)指出的那样,您应该为此使用 HTML 解析器。


我建议你使用Simple HTML DOM,因为它很容易使用,而且他们的文档也很好。

于 2012-07-31T17:21:55.363 回答