免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2958 | 回复: 7
打印 上一主题 下一主题

关于PHP正则表达式匹配问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-11 10:27 |只看该作者 |倒序浏览
5可用积分
用PHP正则表达式匹配html页面中的形式如:
<html>
<script  type="text/javascript">
    function test ()    //<script>测试
    {
        alert ('test');    //<!--显示对话框消息-->
    }
</script>
<body>
测试
</body>
</html>

我写了一段正则表达式来匹配上面html的脚本内容:
/<[sS]{1}[cC]{1}[rR]{1}[iI]{1}[pP]{1}[tT]{1}\s{0,}[_a-zA-Z0-9~`!@#$%^&*?()_+\-=\\\[\]|:;\"'\/,.{}\s".chr(0xa1).'-'.chr(0xff)."]{0,}>
[_a-zA-Z0-9~`!@#$%^&*?()_+\-=\\\[\]|:;\"'\/,.{}\s".chr(0xa1).'-'.chr(0xff)."]{0,}<\/[sS]{1}[cC]{1}[rR]{1}[iI]{1}[pP]{1}[tT]{1}>/

但不能成功匹配上面这个脚本,我仔细查看,发现脚本里面不能含有如"<"或">"这样的标签,如果有这样的标签,就会失败,如果有高手写的正则表达式能匹配上面这个脚本内容,将万分感谢。

[ 本帖最后由 elog 于 2008-6-11 10:30 编辑 ]

最佳答案

论坛徽章:
0
2 [报告]
发表于 2008-06-11 10:27 |只看该作者
  1. <?php
  2. $html_body = "<html>
  3. <head>
  4. <script type=\"text/javascript\">
  5. function test ()    //<script>测试
  6. {
  7.     alert ('test');    //<!--显示对话框消息-->
  8. }
  9. </script>
  10. <title>the title</title>
  11. </head>
  12. <body>
  13. <h1>h1</h1>
  14. <p>test</p>
  15. </body>
  16. </html>";

  17. preg_replace_callback("/(?<=<script type=\"text\/javascript\">)(.*)(?=<\/script>)/s", create_function('$matches', 'var_dump($matches);'), $html_body);
  18. ?>
复制代码

论坛徽章:
0
3 [报告]
发表于 2008-06-11 11:00 |只看该作者
$b=preg_match_all("(<script.+?</script>)",$ff,$array);

一行代码不就搞定了

论坛徽章:
0
4 [报告]
发表于 2008-06-11 11:09 |只看该作者

回复 #2 yanglei1979 的帖子

试过的,不行,在这个脚本之后的所有内容都有可能被替换,最开始我就是用这个表达式进行匹配,特别是有多个<script>*</script>,后来无奈之下才改成我现在这个。

论坛徽章:
0
5 [报告]
发表于 2008-06-11 11:14 |只看该作者
$ff=str_replace("\n","",$ff);
$ff=str_replace("\r","",$ff);

用这两行代码过滤下要处理的字符串就可以了

论坛徽章:
0
6 [报告]
发表于 2008-06-11 11:22 |只看该作者

回复 #4 yanglei1979 的帖子

呵呵,谢谢yanglei1979,这么积极的回答我的问题,但你所考虑过的我都考虑过了,全部过虑掉\n和\r的不符合我的需求,实际上就是过滤了,也不能正确匹配,我希望你写一段正则表达式的时候,最好是代入到实际内容里,正则表达式光看不做实际检验,是很难写出正确的表达式的,特别是比较复杂的情况下。

论坛徽章:
0
7 [报告]
发表于 2008-06-11 11:42 |只看该作者
不会吧,我用这样的代码,做过很多采集分析的,怎么你就不行呢

思路是这样的:先用 file()函数获取网页源代码,然后对有特征的字会串进行匹配,就可以找到所需要的内容了.

你是想要 <script  到 </script> 之间的内容是吗

那就用$b=preg_match_all("(<td.+?</td>)",$ff,$array);  这样的来匹配一下就行了,比如上面的是找出所有 <td 到 </td> 之间的内容,如果有多个符合条件的,则以数组的形式放到 $array变量中去.

论坛徽章:
0
8 [报告]
发表于 2008-06-11 14:19 |只看该作者

回复 #7 percy 的帖子

percy的方法非常正确,解决了我说的这个问题,可见和高手间的差距还是很明显的,非常感谢percy。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP