2015-05-14 1 views
2

У меня есть следующий код:заменить только подстроку, которая имеет класс блик Javascript

document.getElementById("rep").innerHTML = document.getElementById("rep").innerHTML.replace(rxp, "abc");
<div id="rep"> asd 123 asd <span class="light">123</span> asd 123 asd <span class="light">123</span> </div>

Здесь rxp является регулярным выражением, которое соответствует числу. Проблема в том, что я хочу заменить только те 123, которые не включены в span, и не заменять 123, который прилагается к <span class="light">.

ответ

2

Вы можете использовать reverse string trick использовать отрицательный смотреть вперед, а не негативный взгляд-за (который не поддерживается регулярных выражений JavaScript):

function revStr(str) { 
 
    return str.split('').reverse().join(''); 
 
} 
 

 
var rxp = new RegExp("[0-9]+(?:\\.[0-9]+)?(?![^>]*>\"thgil\"=ssalc\\s+naps<)", "gm"); 
 
var str = '<div id="rep"> asd 123 asd <span class="light">123</span> asd 123 asd <span class="light">123</span> </div>'; 
 
var result = revStr(revStr(str).replace(rxp, revStr('abc'))); 
 
document.getElementById("res").value = result;
<input id="res"/>

Вы должны также используйте обратную заменяющую строку.

EDIT: В случае, если вам нужно проверить, если номер не заключен в любом<span> тегов с любыми атрибутами, вы можете использовать более простое регулярное выражение:

var rxp = new RegExp("[0-9]+(?:\\.[0-9]+)?(?![^>]*>[^>]*\\bnaps<)", "gm"); 
+0

А что, если регулярное выражение для чисел: var rxp = new RegExp ("(([0-9] + \.? [0-9] +) | ([0-9] +))", "gm"); – EMM

+0

Я не вижу никаких проблем, так как вы только сопоставляете цифры и необязательную точку между цифрами: 'var rxp = new RegExp (" [0-9] + (?: \\. [0-9] +)? (?! [^>] *> \ "thgil \" = ssalc \\ s + naps <) "," gm ");'. ** EDIT **: я удалил границу слова '\ b', возможно, вам также нужно удалить цифры даже в случае' xxx123'. –

+0

Это действительно творческое решение –