Помогите составить регулярное выражение для JavaScript

SN
На сайте с 04.07.2013
Offline
84
639

В переменной x есть код:

<div id="str">Текст 1</div>

<div id="str">Текст 2</div>

<div id="str">Текст 3</div>

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

Делаю следующим образом:

x = x.match(/<div class=\"str\">(.+)<\/div>/g)

На выходе получаю массив с одним элементом:

x[0] = '<div id="str">Текст 1</div>

<div id="str">Текст 2</div>

<div id="str">Текст 3</div>'

Т.е. учитывается самый первый открывающий тег и самый последний закрывающий.

Скажите, как прописать регулярное выражение, чтобы разбить массив на 3 элемента:

x[0] = '<div id="str">Текст 1</div>'

x[1] = '<div id="str">Текст 2</div>'

x[2] = '<div id="str">Текст 3</div>'

Спасибо!

K0
На сайте с 01.09.2016
Offline
72
#1

x = x.match(/<div class=\"str\">(.+?)<\/div>/g)
И пример у вас немного некорректный - в данных у вас id="str", а ищете class="str" .
S
На сайте с 30.09.2016
Offline
469
#2
kom09:
И пример у вас немного некорректный - в данных у вас id="str", а ищете class="str" .

И вообще, id должен быть уникальным, поэтому нечего ему там делать

x = x.match(/<div id="\w+">[^<]+<\/div>/g)
Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
РАН
На сайте с 20.04.2016
Offline
43
#3
SeoNk:
В переменной x есть код:

<div id="str">Текст 1</div>
<div id="str">Текст 2</div>
<div id="str">Текст 3</div>

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

x = x.match(/<div class=\"str\">(.+)<\/div>/g)

На выходе получаю массив с одним элементом:

x[0] = '<div id="str">Текст 1</div>
<div id="str">Текст 2</div>
<div id="str">Текст 3</div>'

Т.е. учитывается самый первый открывающий тег и самый последний закрывающий.

Скажите, как прописать регулярное выражение, чтобы разбить массив на 3 элемента:

x[0] = '<div id="str">Текст 1</div>'
x[1] = '<div id="str">Текст 2</div>'
x[2] = '<div id="str">Текст 3</div>'

Спасибо!

Как вариант:


x = x.match(/<div class=\"str\">([^<]+)<\/div>/g)

У Вас тут дело в том, что строка полостью подходит под ваш шаблон, т.е.

x[0] = '<div id="str">(Текст 1</div>

<div id="str">Текст 2</div>

<div id="str">Текст 3) == (.+)</div>'

S
На сайте с 30.09.2016
Offline
469
#4
РАН:
У Вас тут дело в том, что строка полностью подходит под ваш шаблон

Это если переносы строк не использовать, а так бы прокатило. BBкод

 зря используете, он квадратные скобки уродует.
S1
На сайте с 15.09.2016
Offline
9
#5

А зачем регулярка?

var wrap = document.createElement('div');
wrap.innerHTML= '<div id="str">Текст 1</div> <div id="str">Текст 2</div> <div id="str">Текст 3</div>';
wrap.childNodes[0]; // <div id="str">Текст 1</div>
wrap.childNodes[1]; // <div id="str">Текст 2</div>
wrap.childNodes[2]; // <div id="str">Текст 3</div>

Еще один вариант (кривой, но рабочий):

var str = '<div id="str">Текст 1</div><div id="str">Текст 2</div><div id="str">Текст 3</div>';
str = str.split('</div>');
alert( str[0] + '</div>' ); // <div id="str">Текст 1</div>
alert( str[1] + '</div>' ); // <div id="str">Текст 2</div>
alert( str[2] + '</div>' ); // <div id="str">Текст 3</div>
SEO анализ сайта (https://seo11.ru/)
R
На сайте с 20.02.2015
Offline
59
#6

ТС, советую почитать Жадные и ленивые квантификаторы.


// захват любого блока <div> в строке даже пустого
x = x.match(/<div[^>]*>[^<]*<\/div>/g)
SN
На сайте с 04.07.2013
Offline
84
#7

Спасибо огромное за варианты! По первому совету уже все заработало.

kom09:
x = x.match(/<div class=\"str\">(.+?)<\/div>/g)
И пример у вас немного некорректный - в данных у вас id="str", а ищете class="str" .


Со знаком вопроса все заработало. Но я никак не могу понять смысла этого выражения.

? - означает, что предыдущий символ или регулярное выражение встречается 0 или 1 раз. Предыдущий символ - знак + который указывает на то, что предыдущий символ или выражение встречается 1 или более раз. Перед плюсом точка - любой символ, кроме переноса строки.

Как это понимать применительно к поставленной выше задаче?

S
На сайте с 30.09.2016
Offline
469
#8
SeoNk:
Как это понимать применительно к поставленной выше задаче?

Знак "?" в этом случае отключает жадность. Как альтернатива - [^<]. И круглые скобки там ни к чему, если маску использовать не собираетесь.

K0
На сайте с 01.09.2016
Offline
72
#9
SeoNk:
? - означает, что предыдущий символ или регулярное выражение встречается 0 или 1 раз.

Если он бы был сам по себе. А тут он переключает конструкцию .+ из жадного в ленивый режим. Даже по названию понятно, чем они отличаются.:)

По ссылке rereg все подробно расписано. :)

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