簡體   English   中英

Javascript正則表達式空白是古怪的

[英]Javascript regex whitespace is being wacky

我正在嘗試編寫一個正則表達式,在頁面中搜索任何腳本標記並提取腳本內容,並且為了適應任何HTML編寫樣式,我希望我的正則表達式包含任意數量的空白字符的腳本標記(例如應該找到<script type = blahblah><script type=blahblah> 我的第一次嘗試最終得到了時髦的結果,所以我將問題分解為更簡單的問題,並決定只使用像/ \\ s * h \\ s * / g這樣的正則表達式來測試和使用。

當在字符串上測試它時,由於某種原因,'h'周圍的任意數量的空白將是匹配的,而其他任意量都不會,例如“h”匹配但“h”不匹配。 有誰知道為什么會發生這種情況或我正在犯的錯誤?

既然你使用的是JavaScript,為什么不能只使用getElementsByTagName('script') 這就是你應該怎么做的。

如果您以某種方式擁有HTML字符串,請創建一個iframe並將HTML轉儲到其中,然后在其上運行getElementsByTagName('script')

好的,為了擴展Kolink的答案,你不需要iframe或事件處理程序:

var temp = document.createElement('div');
temp.innerHTML = otherHtml;
var scripts = temp.getElementsByTagName('script');

...現在腳本是腳本元素的DOM集合 - 腳本不會被執行...


為什么正則表達式不是一個很棒的主意:

由於<script>元素可能不包含字符串</script> ,因此編寫正則表達式以匹配它們並不困難: </script> /<script[.\\n]+?<\\/script>/gi </script> /<script[.\\n]+?<\\/script>/gi

看起來您只想匹配具有特定類型屬性的腳本。 您也可以嘗試將其包含在您的模式中:/< /<script[^>]+type\\s*=\\s*(["']?)blahblah\\1[.\\n]*?<\\/script>/gi - 但這太可怕了。(當你在不規則字符串上使用正則表達式時,就會發生這種情況,你需要簡化)

因此,您遍歷所有基本匹配的腳本,提取起始標記: result.match(/<script[^>]*>/i)[0]並在其中搜索您的類型屬性/type\\s*=\\s*((["'])blahblah\\2|\\bblahblah\\b)/.test(startTag) 。哦看 - 它回到可怕 - 簡化!

這次通過規范化: startTag = startTag.replace(/\\s*=\\s*/g, '=').replace(/=([^\\s"'>]+)/g, '="$1"') - 現在你處於危險區域,如果=在引用的字符串中怎么辦?你能看到它變得越來越復雜嗎?

如果您對將要使用它的HTML做出有力的假設(即使其成為常規),那么您只能使用正則表達式進行此工作。 否則你的問題會成長,成長和成長!

  • 免責聲明:我沒有測試任何正則表達式,看看他們是否做了我說他們做的事情,他們只是示例嘗試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM