[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: страное поведение регулярки JS
DedMorozzz
Привожу без изменений выборку

//var text = $('iframe').html(); --- тут кусок ХТМЛ, его ниже выведу

var text = '[if lt IE 4]'+
+
'\r\n<script src="https://servedbyadbutler.com/adserve/;ID=157926;size=728x175;setID=147015;type=js" type="text/javascript">'
+'\r\n</script>'
+'\r\n<noscript>'
+'\r\n<a href="https://servedbyadbutler.com/go2/;ID=157926;size=728x175;setID=147015">'
+'\r\n<img src="https://servedbyadbutler.com/adserve/;ID=157926;size=728x175;setID=147015;type=img;tP=1" border="0" height="175" width="728" alt=""></a>'
+'\r\n</noscript>[endif]';

var match = text.match(/<a\s*[^>]*href\s*\=\s*(\"|\')([^\1]+?)\1[^>]*>(.*)<\/a>/m);
console.log(match[2]);

Выводит:
https://servedbyadbutler.com/go2/;ID=157926;size=728x175;setID=147015">
<img src=


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

var match = text.match(/<a\s*[^>]*href\s*\=\s*(\"|\')([^\1]+?)\1.*?[^>]*>(.*)<\/a>/m);
console.log(match[2]);

Даже .*? если заменить на .{0,1} так же всё ок. Каким-то чудом необходимо вызвать срабатываение не жадного поиска

В общем мб кто увидит тут явную проблему, но на мой взгляд - тут какая-то хрень

_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
DedMorozzz
Кто нить в состоянии пояснить данное поведение регулярки?

_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
Invis1ble
проблема, я думаю, здесь: [^\1]
Цитата
Parentheses and Backreferences Cannot Be Used Inside Character Classes
...
Backreferences too cannot be used inside a character class. The \1 in regex like (a)[\1b] is either an error or a needlessly escaped literal 1. In JavaScript it's an octal escape.

источник
кстати, у тебя там еще ненужные экранирования в 3-х местах

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Invis1ble
PS. Зачем вообще тут регулярка? Это же браузер, к тому же еще и jQuery юзаешь, тут сам бог велел юзать DOM :)
примерно так:
var hrefs = $('iframe a[href]').map(function () {
return this.href;
}).get();


_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

DedMorozzz
Цитата (Invis1ble @ 6.06.2014 - 21:51)
PS. Зачем вообще тут регулярка?

Не вникал. Тим лид попросил помочь с регуляркой. А зачем она ему и что он с ней далее делает - хз

_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
glock18
А чего регулярка-то какая извращенная (ужос)... Во-первых, Инвиз прав - [\1] не должно работать тем образом, каким ожидается. \1 трактуется в скобках восьмеричный код символа. То есть код: 1, что за символ такой понятия не имею, но факт таков, что это непечатаемый символ.
DedMorozzz
\1 - это первое вхождение. Т.е. в нём содержится то, что в 1х скобках

_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
glock18
Цитата (DedMorozzz @ 6.06.2014 - 19:58)
\1 - это первое вхождение. Т.е. в нём содержится то, что в 1х скобках

laugh.gif Спасибо за экскурс в теорию. Это так только вне квадратных скобок. Внутри квадратных скобок \1 в такой трактовке полностью лишено смысла.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.