LINUX.ORG.RU
ФорумTalks

[Оперосрач] Популярная в России поделка не понимает регекспы


0

0

За что же разработчики оперы так не любят своих пользователей и Российских веб-разработчиков (другим повезло больше — это поделие не популярнее IE5.5).

С виду невинный регексп /^(\d+){2,}/ вводит оперу в ступор — она считает что в строке '12' не содержится две цифры. В то время как нормальные браузеры, например IE6 считают что содержится.

Пример: '12'.match(/^(\d+){2,}/)

Результаты: Opera: null; Firefox: [«12», «2»]

А причина бага та же, как и у сотни других — хотели соптимизировать и решить регексп за O(n) — сломали валидацию на некоторых сайтах.

Когда уже разработчики оперы перестанут нас троллить и перейдут на вебкит?

Ну и что тут удивительно? Оно и xslt делать жаваскриптом позже всех научилось

slyjoe
()

>Когда уже разработчики оперы перестанут нас троллить и перейдут на вебкит?

когда головой сильно ударятся, либо когда организуют непрерывные поставки травы в свой офис.

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

>когда головой сильно ударятся, либо когда организуют непрерывные поставки травы в свой офис

Велосипед, хоть и с квадратными колёсами, но свой

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

>ip1981 (*) (23.11.2009 18:24:59)

Это часть большого регекспа. Попробуй раскрыть такое: /^\+?(\d+[\- ]?)?([- ]?\(\d+\)[- ]?)?(\d+[\- ]?){3,}\d$/i (проверка телефона).

root_at_localhost (*) (23.11.2009 18:33:07)

Всё-таки майкрософт не позволяет себе таких фэйлов. Регексповый движок наверняка встроен во многие места, и ошибки в нем критичны. В gecko тоже, наверное, используется сторонняя проектированная библиотека. Только школота позволяет релизить непротестированный движок регекспов называя это безопастным и быстрым продуктом.

future-of-the-lor
() автор топика

>/^(\d+){2,}/

Насколько я понимаю НКА - регэксп может запросто деградировать до O(N!) и вылететь по квоте ОЗУ от финтов ушами вроде последовательности неопределенной длины вложенной в другую последовательность неопределенной длины.

Absurd ★★★
()
Ответ на: комментарий от future-of-the-lor

>Всё-таки майкрософт не позволяет себе таких фэйлов.

ORLY? Скажи мне, дорогой друг, почему IE8 (берём последнюю версию для верности) при открытии http://serenareem.net/ начинает что-то лепетать про фиды, м?

>С виду невинный регексп

>Когда уже разработчики [...] перейдут на вебкит?


Толстый тролль толст. Говоришь про JS, а потом внезапно про движок. Гугл взял тот же вебкит, а JS у них свой, к примеру.

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

>Умные люди не думают, что они dev пакеты

fixed

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

Две и более? :) (чтоб за третьей не бегать)

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

>>> /^(\d+){2,}/

Я бы написал \d\d+ или \d{2,} или \d\d\d*

Это хоть слёту понятнее.

Твой вариант не равен варианту ТС.

боюсь перейти в техническую плоскость, но сильно хочу узнать, в чем разница между /^(\d+){2,}/ и /^\d\d+/, между /^(\d+){2,}/ и /^\d{2,}/ и, наконец, между /^(\d+){2,}/ и /^\d\d\d*/

Мне интересно, есть ли хоть одна строка, которая подойдёт только под одно из выражений и не подойдёт под остальные.

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

> что такое группы знаешь?

это ты так по пунктам ответил?

name_no ★★
()
Ответ на: комментарий от future-of-the-lor

> Это кусок регекспа. Оригинал был написан выше – в нём есть смысл такой конструкции.

это я понял. Мне интересно именно то, что я спросил, остальное в этой теме - унылый троллинг.

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

Строка странная. Учитывая «жадность» квантификатора «+», он «сожрет» все идущие подряд цифры в строке, так что «{2,}» сразу никогда не выполнится. Если бы было строго {2}, то строка разбивалась бы на пары цифр (в случае общего нечетного числа цифр последняя отбрасывается), а так регэксп совпадает, фактически когда строка \d+ состоит в точности из одной цифры, а суффикс повторения равен длине числа.

Так что, как я подозреваю, пример эквивалентен вот чему: он всегда совпадает с числом с любым количеством цифр, а в переменную \1 он заносит последнюю цифру числа.

Подозреваю, что автор сам не очень понимает, чего хочет. Если ему надо найти «строки, начинающиеся с цифры», то правильнее написать

/^(\d){2,+}/ или /^([0-9]){2,+}/

что будет работать существенно быстрее.

Если же ему надо именно свое поведение, то регэксп

/^\d*(\d)/

решает его задачу.

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

Что только не придумают оперофаги чтобы защитить любимое поделие. Повторяю — в оригинале регексп был такой:

/^\+?(\d+[\- ]?)?([- ]?\(\d+\)[- ]?)?(\d+[\- ]?){3,}\d$/i

То что от него отсалось — всего лишь test case

future-of-the-lor
() автор топика
Ответ на: комментарий от future-of-the-lor

Да я оперой в жисть не пользовался.

Кстати, думаю, что проблема в том, что опера вместо абстрактной «цифры» подставляет конкретную. Попробуй все то же самое, но на строке «11»

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

> Учитывая «жадность» квантификатора «+», он «сожрет» все идущие подряд цифры в строке, так что «{2,}» сразу никогда не выполнится.

не правда

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

> не правда

Твой ответ не подпадает под регэксп русского языка.

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

Что «неправда»?

Первым делом \d+ сожрет всю строку чисел, а потом НКА начнет откатываться по одной позиции для поиска совпадений с числом повторений больше двух. Так он и будет откатываться, пока число повторений не станет равным числу цифр, после чего обработка регэкспа закончится.

annoynimous ★★★★★
()
Ответ на: комментарий от future-of-the-lor

> /^\+?(\d+[\- ]?)?([- ]?\(\d+\)[- ]?)?(\d+[\- ]?){3,}\d$/i (проверка телефона)
OhShi~~

Возможно, конечно, это зависит от задачи, но мне кажется, телефон лучше проверять так:
1. убрать все нецифры
2. проверить телефон
3. форматировать так, как хочется

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

с каких пор не выполнеться?

приеду в мск - открою dragon book. но по моему, в регулярках нет жадности

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