Re: [問題] 一段表達式, 希望版友能幫忙解析...
※ 引述《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
→
11/02 11:23, , 1F
11/02 11:23, 1F
→
11/02 11:25, , 2F
11/02 11:25, 2F
→
11/02 11:26, , 3F
11/02 11:26, 3F
→
11/02 11:27, , 4F
11/02 11:27, 4F
→
11/02 11:35, , 5F
11/02 11:35, 5F
補充一個沒提到的部分:
(?:(?!<\/?+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)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 4 篇):
PHP 近期熱門文章
PTT數位生活區 即時熱門文章