簡體   English   中英

正則表達式替換字符串但不在 html 標記內

[英]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結構非常有信心,請嘗試以下操作:

  1. 做“壞”改變
  2. 重復替換(<[^>] *)(<[^>] +>)幾次到$ 1(盡可能多)

這是一個簡單的解決方法,但對我有用。

缺點? 嗯......你必須為這個案例做兩次替換...... ...>因為它只刪除了頁面上每個標簽的第一個不需要的標簽

[編輯:] 解決方案

為什么不使用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.

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