LINUX.ORG.RU

Помогите с регуляркой

 , ,


0

4

Всем привет!

Нужно в строке, содержащей html, найти и обрезать все теги вида <tag class=«my-class» data-attrs=«attr1,attr2,...attrN»>text</tag>, сохранив при этом текст (text) данного тега, который помещается на меcто самого тега.

Навоял регулярку:

html_str = html_str.replace(/(<tag\s+class=\"my-class\"\s+data-attrs=\"[^.*?]+\">([^.*?]+)<\/tag>)/ig, "$2");

При первом «прогоне» текста через регулярку - работает норм. При последуюющих прогонах начинается какая-то фигня - режется совсем не так как нужно.

Подскажите, пожалуйста, в чем может быть косяк?



Последнее исправление: djnoob (всего исправлений: 1)

[^.*?]+

Что это значит?

Deleted
()
> s
'sadsdsa <tag class="my-class" data-attrs="jjj">text</tag>ываывавыа<tag class="my-class" data-attrs="jjj">nуекст   </tag>цццццыва<tag class="my-class" data-attrs="jjj">        s possible, giving back as needed [</tag>авыаваыа<tag class="my-class" data-attrs="jjj">яба45354534</tag>'
> str = s.replace(/<tag\s+class=\"my-class\"\s*\w.*?>([^<]*)<\/tag>/ig, "$1")
'sadsdsa textываывавыаnуекст   цццццыва        s possible, giving back as needed [авыаваыаяба45354534'

у тебя слишком жадный регексп текста в атрибутах и в теге

Nicholass ★★★
()

Косяк в использовании регулярок вместо lxml/фронтендов к нему.

Deleted
()
> str = '<tag class="my-class" data-attrs="attr1,attr2,...attrN">text</tag>';
< "<tag class="my-class" data-attrs="attr1,attr2,...attrN">text</tag>"
> str.replace(/(<([^>]+)>)/ig, '')
< "text"
EXL ★★★★★
()
$_ = "<tag class=«my-class» data-attrs=«attr1,attr2,...attrN»>blabla1</tag>
<tag class=«my-class» data-attrs=«attr1,attr2,...attrN»>blabla2</tag>
<tag class=«my-class» data-attrs=«attr1,attr2,...attrN»>blabla3</tag>";
s/\<tag\ class=\«my-class\» data-attrs=\«.*\»\>(.*)\<\/tag\>/\1/g;
print $_
blabla1
blabla2
blabla3

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

the_electric_hand ★★
()
Ответ на: комментарий от the_electric_hand

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

filequest
()

Я, конечно, дико извиняюся ©, но если дело происходит на клиентсайде, то гораздо проще из HTML-простыни создать DocumentFragment и пройтись по-человечески. А потом, при надобности, обратно в HTML результат слить.

Регулярка тут не поможет, если data-attrs и class будут поменяны местами, например.

border-radius
()
Ответ на: комментарий от border-radius

Upd - можно даже без фрагментов:

function purgeTagsBySelector(sel, html) {
	var frag = document.createElement('div')
	frag.innerHTML = html
	for(var targetList = frag.querySelectorAll(sel), l = targetList.length, i = 0; i < l; i++)
		targetList[i].outerHTML = targetList[i].innerHTML
	return frag.innerHTML
}

var html = '<tag class="my-class" data-attrs="attr1,attr2,...attrN">preved <lalka>azazello</lalka></tag>'
var targetSel = 'tag[class*="my-class"][data-attrs]'

purgeTagsBySelector(targetSel, html)
border-radius
()

Ты по сути хочешь написать парсер html на регулярках.
ИМХО. Проще и быстрее взять готовый.

Int0l ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.