正则表达式首次出现目标字符串

时间:2015-01-06 21:07:13

标签: php html regex

我使用正则表达式来获取以下html代码中的text1和text2。这是我正在使用的: /<div\s?class="right-col">[\s\n\S]*<a[\s\n]?[^>]*>@(.*)<\/a>/ 但显然我错过了text1,只有text2(这里是link to my problem)。

<div class="right-col">
    <h1>
        <a href="url-link-here" title="title-here">title1</a>
    </h1>
    <p>some text here</p>
<div class="some-class">
    <div class="left">
        <span><a href="url-link-here" class="breaking" target="_blank">some text here </a></span>      
    </div>
    <div class="postmeta"><a href="url-link-here" >@text1</a> </div>
</div>
<div class="right-col">
    <h1>
        <a href="url-link-here" title="title-here">title2</a>
    </h1>
    <p>some text here</p>
<div class="some-class">
    <div class="left">
        <span><a href="url-link-here" class="breaking" target="_blank">some text here </a></span>      
    </div>
    <div class="postmeta"><a href="url-link-here" >@text2</a> </div>
</div>

你能告诉我我的正则表达中出了什么问题吗?有没有更好的方法来捕获title1,title2和text1,text2?

2 个答案:

答案 0 :(得分:2)

在这里使用正则表达式并不是最好的方法。这是不好的做法。您应该使用DOM / XML解析器来执行此操作。

我喜欢使用PHP的DOMDocument课程。使用XPath,我们可以快速找到您想要的元素

$dom = new DOMDocument;
$dom->loadHTML($html);
$xPath = new DOMXPath($dom);

$aTags = $xPath->query('//div[@class="some-class"]//a[starts-with(text(), "@")]');

foreach($aTags as $a){
    echo $a->nodeValue;
}

DEMO:http://codepad.viper-7.com/QHOXzH

答案 1 :(得分:0)

这是正则表达式的一个相当普遍的问题,因为它们很贪婪。 [\ s \ S] *(不需要\ n)匹配第一个&#39;&lt;&#39;和&#39; a&#39;因为它的贪婪会与那些相匹配并继续下去。添加一个?使它不贪婪,使用你的链接返回text1和text2。

简短的回答是用[\ s \ S] *替换[\ s \ n \ S] *?但正如其他人所提到的,这可能不是正则表达式的好用。