Jump to content
  • 0

RegExp - как выбрать подстроку?


kozakmamai
 Share

Question

Добрый день!

Помогите плиз. с решением задачи.

Есть строка:

var str = "string <em>substring<em>substring</em>substring</em> xxx substring xxx <em>substring</em> xxx <em>substring</em>";

Необходимо выделить содержимое самых внешних тегов <em> (то что выделено синим).

var str = "string <em>substring<em>substring</em>substring</em> xxx substring xxx <em>substring</em> xxx <em>substring</em>"

Спасибо!

Edited by kozakmamai
Link to comment
Share on other sites

15 answers to this question

Recommended Posts

  • 0
var str = 'string <em>substring<em>substring</em>substring</em> xxx substring xxx <em>substring</em> xxx <em>substring</em>';
str = str.replace(/<em>([\s\S]*?<\/em>)/gi, '<em style="color: #f99;">$1');
alert(str);

Вопрос не в том чтобы разукрасить. Необходимо выбрать подстроки. И кстати это регулярное выражение выбирает следующее:

<em>substring<em>substring</em> !!!! (не то)

<em>substring</em>

<em>substring</em>

Link to comment
Share on other sites

  • 0
Необходимо выделить содержимое самых внешних тегов <em>

под "выделить" я понял именно "раскрасить".

<em>substring<em>substring</em> !!!! (не то)

если бы вы не меняли условия, написанные в ТС, на ходу, то было бы как раз "то" - внутренний <em> раскрашиваться не будет.

Может лучше сначала в DOM этот текст добавить? Так сделать проще будет.

Edited by Riim
Link to comment
Share on other sites

  • 0

В perl-овских регулярках есть рекурсия, там бы эта задача решалась одной строкой, а здесь только так:

var str = '{0[<em> </em>]0}{1[<em>{2[<em> </em>]2}</em>]1}{3[<em>{4[<em> </em>]4}{5[<em> </em>]5}</em>]3}{6[<em>{7[<em>{8[<em> </em>]8}{9[<em> </em>]9}</em>]7}{10[<em> </em>]10}</em>]6}';
var result = [], i = 0, j = 0,
t1 = '<em>', t2 = '</em>',
r1 = /<em>/g, r2 = /<\/em>/g,
l1 = t1.length, l2 = t2.length;

while ((i = l1 + str.indexOf(t1, j)) >= l1) {
while (true) {
var s = str.slice(i, j = str.indexOf(t2, j));
j += l2;
if ((s.match(r1) || []).length == (s.match(r2) || []).length) {
result.push(s);
break;
}
}
}

alert(result.join('\r\n—————-\r\n').replace(/\u0020/g, '_'));

Edited by Riim
Link to comment
Share on other sites

  • 0
Если заранее известен макс. уровень вложенности, то можно использовать что-то вроде

str.match(/<em>(.*?(<em>.*?<\/em))?.*?<\/em>/g)

Кстати да, на практике наверное моно будет задать какой-то определенный запас вложенности, чего должно хватить в большинстве случаев.

А вот в общем виде задача с помощью регулярок в JS, похоже, все-таки не решается.

Link to comment
Share on other sites

  • 0
Кстати да, на практике наверное моно будет задать какой-то определенный запас вложенности, чего должно хватить в большинстве случаев.

А вот в общем виде задача с помощью регулярок в JS, похоже, все-таки не решается.

Может задачу можно решить и без регулярок... :)

Link to comment
Share on other sites

  • 0
Может задачу можно решить и без регулярок... :)

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

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy