作者danny8376 (钓到一只猴子@_@)
标题Re: [问题] 一段表达式, 希望版友能帮忙解析...
时间Tue Nov 5 02:45:03 2013
※ 引述《DongFeng (Little Five)》之铭言:
: 谢谢各位前辈的回答, 前阵子比较忙没有时间上来回覆感谢各位
: 特别谢谢danny8376前辈, 谢谢您那麽用心回答还特地回信到我信箱>///<
: 经过danny前辈分阶段的讲解我已经知道这行表达式是怎麽运作的了
: 白话的说来就是匹配
: <table此处可为非>的任意字串(含空白与无)>
: 匹配非<(一般来说是空白或无)
: 匹配非<table、非</table的任意tag(一般来说是<thead/><tbody/><tr/><td/></tfoot/>)
: </table>
: 这整段可以找出页面中所有不含table的table
: 但对於*+的部分我还是有点疑惑, 我自己的解读是[^>]*+是匹配非>的任意字串後再以该
: 字串作一次以上的验证,也就是说
: <table c>
: <table cl>
: <table cla>
: <table clas>
: <table class>
: <table class=>
: <table class=">
: ......
: <table class="test">
: 因为任意字元的关系所以匹配到c就停止并回传成功, 不知道这样解读对不对
RegExp是不会提前回传成功的
RegExp的行为上必须整段表达式全跑完亦或字串结束还不成功才会结束匹配
抓 <table...> 的部分其实 *+ 跟 + 没太大差异
不过後面就比较有差异了 这段表达式主要是为了效率而写成这样
*+跟+的差异的话 拿/ab*b/和/ab*+b/来匹配abbbb差异就很明显了
(也比较好说明XD)
/ab*b/ =>
ab*b
\/ 开始匹配
a
ab
abb
abbb
abbbb <- 找不到
b* => backtrack
abbb <-
b* 匹配结束 往下继续
abbbb <- 找到
b 全部匹配结束 匹配成功
/ab*+b/ =>
ab*+b
\/ 开始匹配
a
ab
abb
abbb
abbbb <- 找不到
b*+ 匹配结束 往下继续
abbbb <- 字串结束 全部匹配结束 匹配失败
主要差异在於一般状况会试着倒回去让後方能够匹配
而如果用+结尾的则不进行这个行为
: -----------------------------------------------------------------------------
: 後来在表达式的使用上我又遇到了其他的问题, 如前所述前面的表达式是匹配不含tabel
: 的tabel, 但在某些网页上会遇到下面的状况
: <table>
: <tr>
: <td>
: <table>...</table>
: 内文...
: </td>
: </tr>
: </table>
: 使用同样的表达式去匹配的话会抓出最里头的table但却抓不出内文, 後来我在版上爬文
: 後用了另一段表达式: /<table[^>]*+>((<.+?>.*?<\/.+?>|.)+?)<\/table>/is
: 这段表达式可以完整的抓出最外层table以及内容(含里table)
这段用了好多non-greedy 效率差了不少www
(虽然通常都无感啦XD)
而且如果遇到的是像Google那种没半个换行的
这个抓出来的结果还是错的XD
: 但後来我发现这段表达式只有抓出内文中的其中一个table, 虽然抓出来的table是我想要
: 的没错但就是疑惑为什麽其他的table没被抓出来...
: 随文附上资料来源:http://www.thsrc.com.tw/tw/TimeTable/SearchResult
: 其实这是高铁时刻表查询系统, POST的所需资料後即可导出相应的时刻表
: 导出的时刻表内有两个table, 分别是
: <table>...</table>
: <table class="word_size">...</table>
: 没有抓出来的<table class="word_size">...</table>, 虽然里头只是无关紧要的资料,
: 但因为有写[^>]*+的关系一直觉的应该会抓出来才对...
因为抓到第一个<table>...</table>就完成整个RegExp的匹配啦...
要抓第二个的话请从第一个抓完的地方开始再抓一次
: 希望各位前辈能够再拨空帮小的解答一下, 叙述能力不大好文长还请见谅...
个人会建议你这种需求用DOM操作
或者自己写个函数来分析&抓取比较直接
不过你第二个能用没问题也OK
反正一般网页也都会换行XD
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.115.216.102
1F:推 s25g5d4:他不是问*+吗? 以这个例子来说我觉得用*或*+在效能上也 11/05 02:46
2F:→ s25g5d4:是没差耶.. 11/05 02:46
3F:→ danny8376:啊... 半夜头脑不清 打错了XDD 11/05 09:28
4F:→ danny8376:确实我也觉得没太大差异... 不过总比後面用*?好多吧XD 11/05 09:29
※ 编辑: danny8376 来自: 140.115.216.102 (11/05 09:31)
5F:→ DeathWatch:推 11/05 23:41