[英]Regex replace string but not inside html tag
我想使用 JavaScript 替換 HTML 頁面中的字符串,但如果它在 HTML 標記中,請忽略它,例如:
<a href="google.com">visit google search engine</a>
you can search on google tatatata...
我想用<b>google</b>
替換google
,但不是在這里:
<a href="google.com">visit google search engine</a>
you can search on <b>google</b> tatatata...
我試過這個:
regex = new RegExp(">([^<]*)?(google)([^>]*)?<", 'i');
el.innerHTML = el.innerHTML.replace(regex,'>$1<b>$2</b>$3<');
但問題是:我在<a>
標簽中得到了<b>google</b>
:
<a href="google.com">visit <b>google</b> search engine</a>
you can search on <b>google</b> tatatata...
如何解決這個問題?
你最好使用html解析器,而不是正則表達式。 我不確定它是否可以100%可靠地完成。
您可能會或可能不會使用正則表達式。 這取決於您可以精確定義條件。 說你想要更換字符串,除非它在HTML標簽中不夠窄,因為頁面上的所有內容都可能在某些HTML標記內(如果沒有別的話,則為BODY)。
為此可能更好地遍歷DOM樹,而不是嘗試在HTML上使用正則表達式。
你無法真正做到這一點,你的“谷歌”總是在某個標簽中,要么全部替換,要么全部替換
使用正則表達式解析HTML對於除了普通表達之外的任何事情都不容易,因為HTML不是常規的 。
有關更多詳細信息,請參閱此Stackoverflow問題 (和答案)。
我想你們都錯過了這個問題......
當他在標簽內部說出來時,他就意味着在開始標簽內,就像在<a href="google.com">標簽中一樣......這與文字完全不同,比如在<p> </ p>內標簽對或<body> </ body>。 雖然我還沒有答案,但我正在努力解決同樣的問題,我知道它必須能夠使用正則表達式來解決。 一旦我搞清楚,我會回來發布。
替代方法
如果您不能使用HTML解析器或對您的html結構非常有信心,請嘗試以下操作:
這是一個簡單的解決方法,但對我有用。
缺點? 嗯......你必須為這個案例做兩次替換...... ...>因為它只刪除了頁面上每個標簽的第一個不需要的標簽
[編輯:] 解決方案
為什么不使用jQuery,將html代碼放入頁面並執行以下操作:
$(containerOrSth).find('a').each(function(){
if($(this).children().length==0){
$(this).text($(this).text().replace('google','evil'));
}else{
//here You have to care about children tags, but You have to know where to expect them - before or after text. comment for more help
}
});
我正在使用regex = new RegExp("(?=[^>]*<)google", 'i');
好吧,因為一切都是標簽的一部分,所以你的要求沒有任何意義。 如果它只是<a />
標記,您可能只是檢查該部分。 主要是在新的<a>
之前確保你沒有拖尾</a>
標簽
您可以使用REGEX執行此操作,但過濾塊(如STYLE,SCRIPT和CDATA)將需要更多工作,而不是在以下解決方案中實現。
大多數答案都說“你的數據總是在某些標簽中”,但它們缺少這一點,數據總是在某些標簽之間,你想過濾它在標簽中的位置。
請注意,內聯腳本中的標記字符可能會破壞它,因此如果它們存在,則應使用此方法單獨處理它們。 看看這里:
復雜的html string.replace函數
我可以給你一個 hacky 解決方案......選擇一個不在你的字符串中的不可打印字符......。 復制您的緩沖區...現在使用不可打印字符覆蓋您的 dup 緩沖區中的標簽...執行正則表達式以查找 position 和 dup 緩沖區上的匹配長度...現在您知道在原始緩沖區中執行替換的位置
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.