Помогите с regexp

12
Читающий
На сайте с 23.04.2009
Offline
60
1011

<div id="new-123">

<img title="розовый слон" src="http://www.site.ru/uploads/ушастый_слон.jpg" alt="маленький степной розовый слон" />
<br />
<span style="color: #ff6347;">Розовый слон</span> - тут контент с многими включениями слова "слон"
</div>
<script language="JavaScript">
window.onload = function(){
var string = document.getElementById("new-123").innerHTML;
var results = string.replace(/(слон)/g, "$1" + " ************ ");
alert (results);
//document.getElementById("new-123").innerHTML = results;
}
</script>

Ищется "слон", после некоторых манипуляций заменяется содержимое div, как исключить из поиска содержимое тега img, наверное по такой маске - (<img.*">), что бы альты, титлы в нем не обрабатывались и как потом все вернуть обратно в див?

Буду благодарен любой помощи.

Читающий добавил 28.03.2011 в 19:24

Ни кто не предложит дельную мысль, уже всю голову поломал, буду очень признателен.

Лучший доход для файлового трафика: Без бана АВ (http://goo.gl/F4Lem). А так же здесь (goo.gl/HzCxo) и здесь (goo.gl/B5BDC) Закроем продуктовые магазины за не уникальное содержание ©
Читающий
На сайте с 23.04.2009
Offline
60
#1

Апаю, уж больно хочется решить мою проблему.

skAmZ
На сайте с 04.09.2009
Offline
122
#2

Читающий, не понятно что вы хотите.

Читающий:
как исключить из поиска содержимое тега img

Если хочется удалить:


string.replace(/<img.*?>/g, '');
Читающий:
как потом все вернуть обратно в див
Читающий:
var string = document.getElementById("new-123").innerHTML;

Делаем string глобальной, потом используем когда вздумается.

maldivec
На сайте с 04.11.2008
Offline
160
#3
skAmZ:
Читающий, не понятно что вы хотите.

По моему все понятно, человеку нужно во всем тексте заменить слово "слон", но при этом в атрибутах изображения <img title="розовый слон" ...> его заменять не нужно.

[umka]
На сайте с 25.05.2008
Offline
456
#4

По-нормальному этого не сделать, т.к. lookbehind assertion-ы (заглядывание назад) должны быть фиксированной длины.

Т.е. вам, по-идее, нужно вот это: /(?<!<img[^>]+)слон/

но это не будет работать из-за переменной длины выражения в скобках.

Вот это, например, будет работать, и найдёт всех слонов, кроме розовых: /(?<!розовый )слон/

Думаю, вам достаточно просто найти слона НЕ в тэгах:

/(>[^<]*слон|\A[^<]*слон)/

Лог в помощь!
Читающий
На сайте с 23.04.2009
Offline
60
#5
maldivec:
По моему все понятно, человеку нужно во всем тексте заменить слово "слон", но при этом в атрибутах изображения <img title="розовый слон" ...> его заменять не нужно.

Именно так, как сделать не могу допетрить...

'[umka:
;8738914']
Думаю, вам достаточно просто найти слона НЕ в тэгах:
/(>[^<]*слон|\A[^<]+слон)/

Вот за это пасибо, попробую

skAmZ
На сайте с 04.09.2009
Offline
122
#6
maldivec:
По моему все понятно, человеку нужно во всем тексте заменить слово "слон", но при этом в атрибутах изображения <img title="розовый слон" ...> его заменять не нужно.


<div id="new-123">
<img title="розовый слон" src="http://www.site.ru/uploads/ушастый_слон.jpg" alt="маленький степной розовый слон" />
<br />
<span style="color: #ff6347;">Розовый слон</span> - тут контент с многими включениями слова "слон"
</div>
<script language="JavaScript">
window.onload = function(){
var string = document.getElementById("new-123").innerHTML;
string=string.replace(/\n/g, '#n#');
var results = string.replace(/^(.*)(<img.*?>)(.*)$/g, '<div id="text1">$1</div><div id="b_img">$2</div><div id="text2">$3</div>');
results=results.replace(/\#n\#/g, "\n");
document.getElementById("new-123").innerHTML = results;

replace('text1');
replace('text2');
alert(document.getElementById("new-123").innerHTML);
}
function replace(in_block){
document.getElementById(in_block).innerHTML=document.getElementById(in_block).innerHTML.replace(/(слон)/g, "$1" + " ************ ");
}
</script>

Через одно место, но задачу решает.

[umka]
На сайте с 25.05.2008
Offline
456
#7

Если нужна именно замена всех слонов, которые не в тегах, а не просто поиск, то, соответственно

string.replace(/((>[^<]*)слон|\A([^<]*)слон)/g, '$2$3то_что_вместо_слона')

dma84
На сайте с 21.04.2009
Offline
168
#8
'[umka:
;8739061']Если нужна именно замена всех слонов, которые не в тегах, а не просто поиск, то, соответственно
string.replace(/((>[^<]*)слон|\A([^<]*)слон)/g, '$2$3то_что_вместо_слона')

В ваших примерах заменяются только последние вхождения "слонов"


<span style="color: #ff6347;">Розовый слон Розовый слон Розовый слон Розовый слон Розовый слон Розовый слон Розовый слон Розовый слон</span>

Получаем


<span style="color: #ff6347;">Розовый слон Розовый слон Розовый слон Розовый слон Розовый слон Розовый слон Розовый слон Розовый то_что_вместо_слона</span>
Читающий
На сайте с 23.04.2009
Offline
60
#9

[umka], Огромное спасибо, все заработало, подскажите ещё, что значит \A, сам не нашел что-то.

skAmZ, спасибо за участие, ваш пример тоже отлично работает, возьму на заметку.

Читающий добавил 29.03.2011 в 14:29

dma84:
В ваших примерах заменяются только последние вхождения "слонов"

Для моей задачи вполне применимо, замена идет не конкретно по слову. Мне важно было понять как не искать в тегах, поэтому реализация от [umka] вполне подходит.

Всем еще раз спасибо.

[umka]
На сайте с 25.05.2008
Offline
456
#10

\A означает начало строки.

Т.е. мы рассматриваем два варианта:

1. Если перед "слоном" есть '<' и '>' (т.е. тег закрывается)

2. Если перед "слоном" с начала строки нет '<' (т.е. никакой тег не открывается)

я ещё добавил бы модификатор /s

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий