我使用正则表达式来获取以下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?
答案 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;
}
答案 1 :(得分:0)
这是正则表达式的一个相当普遍的问题,因为它们很贪婪。 [\ s \ S] *(不需要\ n)匹配第一个&#39;&lt;&#39;和&#39; a&#39;因为它的贪婪会与那些相匹配并继续下去。添加一个?使它不贪婪,使用你的链接返回text1和text2。
简短的回答是用[\ s \ S] *替换[\ s \ n \ S] *?但正如其他人所提到的,这可能不是正则表达式的好用。