作者s540421 (虫它虫它)
看板PHP
标题Re: [问题] 一段表达式, 希望版友能帮忙解析...
时间Sat Nov 2 11:09:10 2013
※ 引述《padding (100px;)》之铭言:
: ※ 引述《DongFeng (Little Five)》之铭言:
: : 作者: DongFeng (Little Five) 看板: RegExp
: : 标题: [问题] 一段表达式, 希望版友能帮忙解析...
: : 时间: Fri Nov 1 00:00:18 2013
: <table█class="table"><tr><td>col1</td></tr></table>
: 表达式:/<table[^>]*+>([^<]*+(?:(?!<\/?+table)<[^<]*+)*+)<\/table>/i
: 中间那串我也不懂为什麽要这样写 只能帮到这了
: : 这段表达式在实际使用上是抓出来源字串内的所有<table>...</table>
: : 我知道[^>]表达的是 不包含> 的所有字串, 但一直弄不清楚的是在[^>]後面的*+的作用
: : 第一个问题:*是匹配<table[^>]还是匹配[^>], 如果是匹配[^>]是不是表示允许拥有零个
: : 或多个 不包含> 的字串, 因为我一直在想既然是要抓出tabel, 匹配<table[^>]表示允许
: : 零个又很怪
中间那串可以一层层来解析:
(?!<\/?+table)
这里表示要匹配到非<table或</table的内文,用?+而不使用?的目的主要是要避开
backtracking,就跟推文所说的一样,是效能上的考量。
(?:(?!<\/?+table)<[^<]*+)
避开了<table和</table後,匹配到以<开头并以非<结尾的内文,可以抓出tag和text
content(像是<tr>还有<td>col1),用?:也是效能上的考量。
([^<]*+(?:(?!<\/?+table)<[^<]*+)*+)
[^<]*+能匹配到text content或空集合,常理上<table>和<tr>之间不会放text content
,不过这边加上这个pattern的用意大概是因为这是copy来的pattern吧。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.26.115.250
1F:→ danny8376:?:不只效率问题... 打从一开始那边就不列入结果啊... 11/02 11:23
2F:→ danny8376:最後一点... 常理来说不会有文字没错 11/02 11:25
3F:→ danny8376:不过据说 space tab 对电脑来说好像也是个文字 11/02 11:26
4F:→ danny8376:再说如果没那段会导致多了文字就整个拒绝匹配 11/02 11:27
5F:→ s540421:的确,没考虑到tab和换行之类的空白文字,那加这也合理 11/02 11:35
补充一个没提到的部分:
(?:(?!<\/?+table)<[^<]*+)
里面的?:会向前查看(look-ahead),所以这里的解释应是[^<]*+和<[^<]*+之後不允许
<table或</table,像下列的字串:
<table class="table"><tr><td>col1<table</td></tr></table>
其匹配到的内文是<table</td></tr></table>,表格之间的内文是</tr>
※ 编辑: s540421 来自: 114.26.115.250 (11/02 11:45)
※ 编辑: s540421 来自: 114.26.115.250 (11/02 11:45)
※ 编辑: s540421 来自: 114.26.115.250 (11/02 11:47)