Re: [問題] 一段表達式, 希望版友能幫忙解析...

看板PHP作者 (虫它虫它)時間12年前 (2013/11/02 11:09), 編輯推噓0(005)
留言5則, 2人參與, 最新討論串3/4 (看更多)
※ 引述《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
不過據說 space tab 對電腦來說好像也是個文字
11/02 11:26, 3F

11/02 11:27, , 4F
再說如果沒那段會導致多了文字就整個拒絕匹配
11/02 11:27, 4F

11/02 11:35, , 5F
的確,沒考慮到tab和換行之類的空白文字,那加這也合理
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)
文章代碼(AID): #1IT6pPLt (PHP)
文章代碼(AID): #1IT6pPLt (PHP)