2013-07-22 59 views
3

之間找到正斜槓在Javascript函數中,我需要用&#x2F替換HTML標記中不包含的所有正斜槓。Javascript正則表達式在>和<

是否有任何方法使用正則表達式來查找><之間的所有正斜槓?

+0

將這項工作? –

+0

重複的問題http://stackoverflow.com/questions/4455606/how-to-find-text-and-replace-using-jquery –

+3

@DMoses我不認爲這是一個騙局。 – Charlie

回答

2

不完全是這樣,但是如果您處於這種修補程序中,我想您會對快速而骯髒的解決方案感到滿意:如果下一個出現的角度支架不是關閉角度支架,請找到/

result = subject.replace(/\/(?![^<>]*>)/g, "&#x2F"); 

當然,這是極脆的 - 例如,它根本不會關心註釋,字符串等(但,這將是非常困難的正則表達式來退出這個功能)。

+1

+1良好的誠實的答案。 – Paulpro

+0

謝謝,我認爲可能爲這個應用程序工作;我將嘗試它 –

1

您可以測試:

html ='<a href="/sdfsdf/SD/sdfsf">toto/tata</a>'; 

html = html.replace(/(<[^>]+>)|\//g, 
    function (match, p1) { return (p1)?match:"&#x2f"; }); 

console.log (html); 

這樣做是爲了捕獲所有的HTML標籤(和自行替換)試圖匹配斜線之前。然後回調函數測試第一個捕獲組是否存在並返回完全匹配或替換。

您可以改善這種情況的安全應對風格和腳本內容,就像這樣:

html = html.replace(/(<s(tyle|cript)\b[\s\S]*?<\/s\2>|<[^>]+>)|\//gi, 
    function (match, p1, p2) { return (p1)?match:"&#x2f"; }); 
+0

這將取代腳本和樣式標記中的'/',這可能會導致問題 –

+0

@DMoses:現在,它好嗎? –

+0

是的,你可能也想跳過以下內容:'<![CDATA [...]]>'和''請參閱http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#tag-open - 如何解析HTML5。 –

0

這裏是一個很好的例子。第一次打google:http://james.padolsey.com/javascript/find-and-replace-text-with-javascript/

基本思想是遍歷DOM中的所有節點並替換文本節點中的文本。另外,不要替換腳本,樣式,元數據類型標籤中的節點中的任何文本。雖然你可以用一個大的正則表達式來做到這一點,但是如果在每個瀏覽器中都內置了一個dom解析器,那麼在正則表達式中實現dom解析器就沒有什麼意義了。

function findAndReplace(searchText, replacement, searchNode) { 
    if (!searchText || typeof replacement === 'undefined') { 
     // Throw error here if you want... 
     return; 
    } 
    var regex = typeof searchText === 'string' ? 
       new RegExp(searchText, 'g') : searchText, 
     childNodes = (searchNode || document.body).childNodes, 
     cnLength = childNodes.length, 
     excludes = 'html,head,style,title,link,meta,script,object,iframe'; 
    while (cnLength--) { 
     var currentNode = childNodes[cnLength]; 
     if (currentNode.nodeType === 1 && 
      (excludes + ',').indexOf(currentNode.nodeName.toLowerCase() + ',') === -1) { 
      arguments.callee(searchText, replacement, currentNode); 
     } 
     if (currentNode.nodeType !== 3 || !regex.test(currentNode.data)) { 
      continue; 
     } 
     var parent = currentNode.parentNode, 
      frag = (function(){ 
       var html = currentNode.data.replace(regex, replacement), 
        wrap = document.createElement('div'), 
        frag = document.createDocumentFragment(); 
       wrap.innerHTML = html; 
       while (wrap.firstChild) { 
        frag.appendChild(wrap.firstChild); 
       } 
       return frag; 
      })(); 
     parent.insertBefore(frag, currentNode); 
     parent.removeChild(currentNode); 
    } 
} 

然後用它

findAndReplace('\\/', '&#x2F');