关于正则表达式 PHP正则表达式匹配嵌套HTML标签的方法和技巧 不定期更新关于正则内容

前端之家收集整理的这篇文章主要介绍了关于正则表达式 PHP正则表达式匹配嵌套HTML标签的方法和技巧 不定期更新关于正则内容前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


正则表达式是一个非常有用的编程技能。一般来说,简单的抓取一个HTML页面的某一条信息,比如<title>标题</title>,是很容易实现的。但是,我们往往要抓取某一个列表页面里的多个重复的<div></div>块里的特定内容,并且<div></div>块还有嵌套的使用,我们抓取的则是每个重复<div></div>块里的多个信息。同时,网页源文件不同于一般的字符串,其还存在大量的回车、换行和制表符,这些都造成了匹配失败。而初学者往往无法判断到底是哪个环节出现了问题,并且看到高度技巧化的正则表达式会感到非常沮丧,从而导致放弃问题的解决

经过笔者多日的研究,终于摸索出以下方法和技巧,欢迎大家交流指正。


请看如下注意点和步骤:

1.注意/一定要被转义成\/,否则会报错

preg_match_all() [function.preg-match-all]: Unknown modifier


2.正则表达式用单引号'和/作为开始和结束的标界,比如'/reg partten/',采用这样的写法,正则表达式里的双引号"不必转义

比如,

$partten='/<div class="goods_item"><a href="([^<>]+)" target="_blank"><img data-ks-lazyload="([^<>]+)" alt="([^<>]+)" width="" height=""\/>/';


3.需要先去除所有的换行符、制表符、回车等等,对于便于阅读的html源文件由于上述符号的存在会造成无法匹配。

$str=preg_replace("/[\t\n\r]+/","",$str);


4.我们感兴趣的匹配信息,通常是html元素中的属性的值,因此要去除<>,否则只会匹配最后一条之前的全部信息。

比如,对于$string="<div><a href=“1.jpg”></a></div><div><a href=“2.jpg”></a></div><div><a href=“3.jpg”></a></div>",

$partten='/<div><a href=“(.+)”/';的匹配结果是:1.jpg”></a></div><div><a href=“2.jpg”></a></div><div><a href=“3.jpg”></a></div>

这是因为,上述给出的正则表达式确实没有限定匹配的范围只是第一个超链接<a href=“1.jpg”></a>。

因此,要想匹配上述三个超链接的 href属性,需要将上述匹配限定在<a href=“1.jpg”>里面,方法也很简单,将(.+)换成([^<>]+),即可。也就是说,这个匹配不包含下一个出现<>的地方,从而将匹配限定在同一个html标签


做到以上几点,就可以完全无视html标签嵌套不嵌套的问题,从而抓取到一个页面所有的div重复块中我们感兴趣的内容,下附一例。(代码没问题,亲测。。。。。。)



  1. <?
  2. //被匹配的HTML代码
  3. $html='
  4. <divclass="goods">
  5. <ahref="http://url1111"target="_blank">
  6. <imgdata-ks-lazyload="http://1111.jpg"alt="alt1111"width=""height=""/>
  7. </a>
  8. </div>
  9. <divclass="goods">
  10. <ahref="http://url2222"target="_blank">
  11. <imgdata-ks-lazyload="http://2222.jpg"alt="alt2222"width=""height=""/>
  12. </a>
  13. </div>
  14. <ahref="http://url3333"target="_blank">
  15. <imgdata-ks-lazyload="http://3333.jpg"alt="alt3333"width=""height=""/>
  16. </div>';
  17. //去掉换行、制表等特殊字符,可以echo一下看看效果
  18. $html=preg_replace("/[\t\n\r]+/","",$html);
  19. //匹配表达式,注意两点,一是包含在'//'里面,再就是/要做转义处理成\/
  20. $partern='/<divclass="goods"><ahref="([^<>]+)"target="_blank"><imgdata-ks-lazyload="([^<>]+)"alt="([^<>]+)"width=""height=""\/><\/a><\/div>/';
  21. //匹配结果
  22. preg_match_all($partern,0); background-color:inherit">$html,0); background-color:inherit">$result);
  23. //打印结果
  24. var_dump($result);
  25. ?>


输出结果,一共有4个子数组,第一个子数组是匹配到的所有的项,后面三个子数组是我们匹配表达式里的三个匹配项:

  1. array(4){
  2. [0]=>
  3. array(3){
  4. string(144)"<divclass="goods"><ahref="http://url1111"target="_blank"><imgdata-ks-lazyload="http://1111.jpg"alt="alt1111"width=""height=""/></a></div>"
  5. [1]=>
  6. string(144)"<divclass="goods"><ahref="http://url2222"target="_blank"><imgdata-ks-lazyload="http://2222.jpg"alt="alt2222"width=""height=""/></a></div>"
  7. [2]=>
  8. string(144)"<divclass="goods"><ahref="http://url3333"target="_blank"><imgdata-ks-lazyload="http://3333.jpg"alt="alt3333"width=""height=""/></a></div>"
  9. }
  10. [1]=>
  11. array(3){
  12. [0]=>
  13. string(14)"http://url1111"
  14. string(14)"http://url2222"
  15. [2]=>
  16. string(14)"http://url3333"
  17. }
  18. string(15)"http://1111.jpg"
  19. string(15)"http://2222.jpg"
  20. string(15)"http://3333.jpg"
  21. [3]=>
  22. string(7)"alt1111"
  23. string(7)"alt2222"
  24. string(7)"alt3333"
  25. }
有用的正则表达式:

1.preg_replace("/[\s*\t\n\r]/",$url);去掉html网页中的所有空格,换行,还有制表符,包括标签里面的。。

2.preg_replace("/<[^>]*>/",$result);去掉html标签

猜你在找的正则表达式相关文章