Web_Design 板


LINE

※ 引述《pk9058 (WhenSunTea)》之銘言: : 如標題 : regex:/(style[=]["](.*?)["]{2})/ig : HTML內容: : <div id="test" style="color:#FFF;" class="title_block" style="background:#000;" title="Hello"> : <span style="font-size:18pt;">標題</span> : </div> : 在 regexr.com 測試發現他會連同 h2 的style也包含... : 麻煩版上的大大幫小弟解惑,謝謝 不曉得您的意思是不是要找同一個元素裡的所有style標籤 如果是,那有兩種做法: 第一種作法比較簡單 可以單純只用一條Regex來找出「最後那個元素」的所有style標籤 而且所有程式語言都通 Regex的pattern如下: /(style=)('|\")[^'\"]*\2(?!(.|\n)*>(.|\n)*\1('|\")[^'\"]*\5)/gi 如下的程式碼會匹配到紅色字: <div id="test" style="color:#FFF;" class="title_block" style="background:#000;" title="Hello" style="font-size:16px;"> <input style="font-size:18pt;" disabled style="color:red;" name="inp" style="text-align:left;"> <span style="color:#F00;" style="font-family:arial;">ABC</span> </div> <div style="text-decoration:none;" id="test2" style="color:blue">333</div> 我來說明一下這條pattern: 第一個桃紅色部分的「(style=)」意思是匹配「style=」這個字串,這沒什麼學問。 第二個黃色部分的「('|\")[^'\"]*\2」意思是先匹配單引號(')或者雙引號(")1次,然後後面可能有一個或多個不是單引號或雙引號的字元,但也有可能沒接,然後再接跟第2個括號裡匹配的相同字元 (也就是如果你第一次輸入雙引號,這邊就必須也是雙引號,反之單引號亦然) 最後綠色部分的「(?!(.|\n)*>(.|\n)*\1('|\")[^'\"]*\5)」意思是這整個「style="..."」標籤的後面不能有大於符號(>)然後又接著出現「style="..."」或「style='...'」的字樣。 所以只要是最後一個元素的style標籤就通通可以match得到。 第二種就比較複雜麻煩了,必須要配合程式來做才行,而且不見得所有瀏覽器都支援這種方法: 第二種就可以像你所說的匹配「第一個元素」的所有style標籤 如果您是用Javascript寫 Regex的pattern如下: /[^>]*?(style=)('|\")[^'\"]*\2(?=[^>]*>[^>]*)/gyi 這裡我們用到了新的modifier:「y」(在舊瀏覽器,如IE可能不支援) 我來說明一下這個「y」好了 「y」是取「Sticky」的「y」來作為這個modifier的名稱 意思是:「只允許從開頭開始的連續匹配(如果「g」被設定則會連續),連續處是從上一個匹配的字的結尾處開始」 例如: /a/gy 這裡我們只可以匹配所有連續且從開頭開始的「a」 所以「aaassaaaa」只匹配到前三個「a」,後面的「a」則完全都匹配不到 另外像「mmmaaassaaaa」則所有的「a」都匹配不到。 回來上面的Regex pattern, 這行pattern的意思就是:如果「style="..."」或「style='...'」的前面都沒有任何大於符號(>) ([^>]*?),且後面又有出現大於符號(>) ((?=[^>]*>[^>]*)),然後又從開頭連續 (y modifier、g modifier),那麼就匹配 所以像下面這段原始碼會匹配到有底色的字: <div id="test" style="color:#FFF;" class="title_block" style="background:#000;" title="Hello" style="font-size:16px;" alt="test" style="text-shadow:none;"> <span style="font-size:18pt;" title="test1" style="text-decoration:none;" id="test1" style="font-family:arial;">ABC</span> <span style="color:blue;" style="font-weight:bold;">Hello!</span> </div> <div style="position:absolute;" class="test2" style="top:0;left:0;"></div> 但是這並不是我們要的結果, 我們只想要像「style="..."」這樣的標籤 所以就必須要用Javascript程式去擷取字串了。 程式如下: var str = "(原始碼...)"; var res = str.match(/[^>]*?(style=)('|\")[^'\"]*\2(?=[^>]*>[^>]*)/gyi); var result = res.map(function(s){ return s.substr(s.indexOf("style=")); }); 最後得到的陣列result就是我們想要的結果 ◎ 其中這裡的map就是對某一陣列一一做函數的處理。 如果您用第二種方法是用PHP寫的,那麼就把「y」改成「A」即可 「A」與「y」功能雷同,在此不再贅述。 以上。 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.160.30.43
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Web_Design/M.1500790383.A.432.html ※ 編輯: banana2014 (118.160.30.43), 07/23/2017 14:46:39
1F:推 CauseSam: 高手! 07/24 08:21
2F:推 maiico: 很詳細 07/24 10:45
3F:推 ian90911: 推優文 07/24 10:48
4F:推 pk9058: 感謝大大的熱心回復 :) 07/24 22:44
5F:→ pk9058: 目前小弟的寫法是先用下面這段regex來取得attr group 07/24 22:46
6F:推 pk9058: style\s*=\s*['"]?([^'"]+)['"]?/ig 07/24 22:55
7F:→ pk9058: 之後將它刪除,然後重建新的 style 07/24 22:56
8F:→ pk9058: 這是我自己寫的正規表示法,如有錯誤希望大大可以指正小弟 07/24 22:58
9F:→ pk9058: https://codepen.io/anon/pen/oeNdRZ 07/24 22:58
10F:推 pk9058: 小弟熟讀您的文章後又學到新的一課,感謝大大的細心教導 07/24 23:39







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:e-shopping站內搜尋

TOP