Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как победить жадность RegExp? (https://javascript.ru/forum/dom-window/21079-kak-pobedit-zhadnost-regexp.html)

yegor 28.08.2011 01:26

Как победить жадность RegExp?
 
Всем привет! Прошу помочь с regexp'ами.

Есть строка, содержащая такой HTML-код:
<li><i class="remove" title="Удалить"></i><span class="comment">Комментарий</span><img src="img/slider/b/5251.jpg"></li>
<li><i class="remove" title="Удалить"></i><span class="comment">Комментарий</span><img src="img/slider/b/6865.jpg"></li>
<li><i class="remove" title="Удалить"></i><span class="comment">Комментарий</span><img src="img/slider/b/7435.jpg"></li>

Мне необходимо изменить её на такую:
<td><p><img src="img/slider/b/5251.jpg"><i></i></p></td>
<td><p><img src="img/slider/b/6865.jpg"><i></i></p></td>
<td><p><img src="img/slider/b/7435.jpg"><i></i></p></td>

Для этого я применил регулярное выражение:
var path = /.*img\/slider\/b\/([^>]*)(\.png|\.gif|\.jpg).*/gm;
var newStr = oldStr.replace(path, '<td><p><img src="img/slider/b/$1$2"><i></i></p></td>');

И оно работает хорошо, пока не нарушается форматирование HTML-кода.

Но если HTML выстраивается в одну строку без переносов (у меня это происходит из-за сортировки картинок с помощью JQuery UI Sortable):
<li><i class="remove" title="Удалить"></i><span class="comment">Комментарий</span><img src="img/slider/b/5251.jpg"></li><li><i class="remove" title="Удалить"></i><span class="comment">Комментарий</span><img src="img/slider/b/6865.jpg"></li><li><i class="remove" title="Удалить"></i><span class="comment">Комментарий</span><img src="img/slider/b/7435.jpg"></li>

То совпадения тоже оказываются на одной строке, и жадные регулярки заменяют всю эту строку на один тег <td> с последней по счету картинкой:
<td><p><img src="img/slider/b/7435.jpg"><i></i></p></td>

Как можно заставить регулярку найти все совпадения, а не только последнее?

Андрей Параничев 28.08.2011 04:11

var path = /.*?img\/slider\/b\/([^>]*)(\.png|\.gif|\.jpg).*?(?:<\/li>)/gm;
oldStr.replace(path, '<td><p><img src="img/slider/b/$1$2"><i></i></p></td>');


Часовой пояс GMT +3, время: 03:02.