非贪婪匹配遇到换行符

先看两端代码

<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,很显然?在这里起不到非贪婪的作用了,也不知道原因在哪里。

经过大神调拨,原来是这个原理,就是贪婪匹配不是全局匹配一个最短的,而是从表达式匹配的地方开始,去匹配一个最短的。不是想当然从全区抽出来一个。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 9,947评论 0 5
  • http://www.jb51.net/tools/zhengze.html 正则表达式30分钟入门教程 版本:v...
    nullleaf阅读 3,736评论 0 2
  • 本文译自 制作正则引擎的作者 Jan Goyvaerts 为工具 RegexBuddy 写的教程版权归原作者所有注...
    极客圈阅读 8,538评论 0 25
  • 版本:v2.3.5 (2017-6-12) 作者:deerchao 转载请注明来源 目录 跳过目录 本文目标 如何...
    readilen阅读 4,547评论 2 13
  • 正则表达式到底是什么东西?字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等...
    狮子挽歌阅读 6,483评论 0 9