先看两端代码
<a href="//chanpin.molbase.cn/c14597-16-1/"><span>紫胶色酸E</span></a>
</td>
<td><a itemprop="url" target="_blank"
href="//www.molbase.com/en/cas-14597-16-1.html"><span
itemprop="mol_name">3-<3-(2-Aminoethyl)-6-hydroxy-phenyl>-1.2.4.7-tetrahydroxy-anthrachinon-dicarbonsaeure-(5.6); Desacetyl-laccasaeure-A(1)</span></a></td>
<td><a href="//www.molbase.cn/formula/C24H17NO11/" rel="nofollow">C24H17NO11</a></td>
</tr>
<tr>
<td class="img"><img src="//p2.molbase.net/molpic/03/92/3921909.png?142x100"
style="width:45px;" alt="二甲基二硫代氨基甲酸钠二水"/></td>
<td>
<a href="//baike.molbase.cn/cidian/3921909"><span>CAS号72140-17-1</span></a>
<a href="//baike.molbase.cn/cidian/3921909"><span>CAS号72140-17-1</span></a>
//表达式1
$itemP = '#<a.*?href="(.*?)"(.|\n)*?>\s*?<span>CAS号.*?</span>\s*?</a>#i';
//表达式2
$itemP = '#<a.*?href="(.*?)".*?>\s*?<span>CAS号.*?</span>\s*?</a>#i';
我本来想匹配第二段那段代码的,如果用表达式1去匹配的话,会匹配出来一大堆前导废物代码,用第二个表达式才能正确匹配。我找到原因是a标签结束那里不应该用(.|\n)*?去匹配,应该去掉\n,很显然?在这里起不到非贪婪的作用了,也不知道原因在哪里。
经过大神调拨,原来是这个原理,就是贪婪匹配不是全局匹配一个最短的,而是从表达式匹配的地方开始,去匹配一个最短的。不是想当然从全区抽出来一个。