作者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