正则表达式研究——匹配重复标签和嵌套标签 本帖最后由 CunningBoy 于 2010-09-04 10:34:31 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 占位学习一下先贪婪与非贪婪模式各有其应用场景,但都不能用来处理嵌套或配对出现的标记.NET中的平衡组可以解决嵌套标签匹配的问题,记得以前好像在哪见过PHP中说是也有类似语法的,没有PHP环境,没法验证不过针对楼主要求的结果,逐层获取嵌套标签,即使是支持平衡组或类似的语法,也不可能通过一个正则获取到这些结果的,还需要结合循环或者递归来达到这一目的这样的话,正则无论从实现难易程度上,还是执行效率上就都不占优了正则由于进行了尽可能的抽象,所以具有高度的灵活性和可扩展性,但是在处理某些特定问题的时候,它又会做许多额外的判断,无形中降低了匹配效率其实正则也不过是有穷状态机的一种实现,我们完全可以通过“栈”的方式,自己去写个方法来实现这一需求一家之言,欢迎讨论,PHP的代码我是写不出了,只能进行一下理论上的探讨 preg_replace('/(>)([^>|^<\?|^\r\n][^\d]+?)([<|<\/])/i', "$1<?php print_R(\$translate->_(\"$2\")) ?>$3", $data);看一下这个是不是你想要的,我这里不是获取标签里面的内容,而是给标签里面的内容加上一个指定的函数,我试过了,只能匹配80%,要完全匹配还得花点心思 上面有一点小问题,再发一个preg_match_all('/([^\?|^>]>){1}([^>|^<\?|^\r\n|^if]+?)([<|<\/][^\?])/U', $string, $arr);print_R($arr); 我相信这个可以做到或接近做到:http://ca.php.net/manual/en/regexp.reference.recursive.php下面的那个注释已经可以匹配对应的,但是似乎只是最外层的 JavaScript是用于处理你自己的网页的。如果想抓取别人的网页内容,用JavaScript是处理不了的。 单纯的使用正则表达式,几乎是不可能完成的。即便是 .NET中的平衡组 也是这样即便是能够识别了,也不能很好的解决正文中出现的“<”、“>”。比如 xml 解析器就要求强制转义<>而专为解析 HTML 而设计的 tidy 依然不能识别正文中的 <字母 组合 aaaabbbbccc<a href="aaa.html">aaaaabbbbcccc</a>aaaabbbccc要把a标签外面的a元素找出来,该怎么匹配preg_match_all("#<a[^>]*>(.*?)<\/a>#",$str2,$arr);这样写只能把a标签找到... 请问php能实现embed标签src内容的动态生成吗? 如何将下面地址的查询界面嵌入PHP页面,并将查询结果返回到我自定的页面? 请大家帮用PHP写个简单的排序函数 php+access+odbc上传到西部数码的虚拟主机上不能查询数据 急:求一算法,输入任意月份得出每一个月周的开始和结束日期 简单问题 关于imap_open()和INBOX的问题 能不能用html实现像include一样的功能? 类和setcookie结合的问题 php读取excel内容 字段格式变了 linux 中运行PHP出错 这样的参数是怎么弄的? www.xxx.com/?aaa-bbb-cc
占位学习一下先贪婪与非贪婪模式各有其应用场景,但都不能用来处理嵌套或配对出现的标记.NET中的平衡组可以解决嵌套标签匹配的问题,记得以前好像在哪见过PHP中说是也有类似语法的,没有PHP环境,没法验证不过针对楼主要求的结果,逐层获取嵌套标签,即使是支持平衡组或类似的语法,也不可能通过一个正则获取到这些结果的,还需要结合循环或者递归来达到这一目的这样的话,正则无论从实现难易程度上,还是执行效率上就都不占优了
正则由于进行了尽可能的抽象,所以具有高度的灵活性和可扩展性,但是在处理某些特定问题的时候,它又会做许多额外的判断,无形中降低了匹配效率
其实正则也不过是有穷状态机的一种实现,我们完全可以通过“栈”的方式,自己去写个方法来实现这一需求一家之言,欢迎讨论,PHP的代码我是写不出了,只能进行一下理论上的探讨
preg_replace('/(>)([^>|^<\?|^\r\n][^\d]+?)([<|<\/])/i', "$1<?php print_R(\$translate->_(\"$2\")) ?>$3", $data);看一下这个是不是你想要的,我这里不是获取标签里面的内容,而是给标签里面的内容加上一个指定的函数,我试过了,只能匹配80%,要完全匹配还得花点心思
print_R($arr);
http://ca.php.net/manual/en/regexp.reference.recursive.php下面的那个注释已经可以匹配对应的,但是似乎只是最外层的
如果想抓取别人的网页内容,用JavaScript是处理不了的。
即便是能够识别了,也不能很好的解决正文中出现的“<”、“>”。
比如 xml 解析器就要求强制转义<>
而专为解析 HTML 而设计的 tidy 依然不能识别正文中的 <字母 组合
要把a标签外面的a元素找出来,该怎么匹配
preg_match_all("#<a[^>]*>(.*?)<\/a>#",$str2,$arr);这样写只能把a标签找到...