Как насчет этого JS RegEx делает его сбой в IE7 и IE8, но не IE9? - PullRequest
0 голосов
/ 09 ноября 2011

Я думал, что сообщество помогло мне зафиксировать эту проблему без учета регистра RegExp, но я ошибся. Как насчет следующих сбоев RegEx в IE7 и IE8?

var reggy = /(\s*?)<span\b(?:.*?)(?:class=(?:'|"|.*?\s)?foobar(?:\s|\3))(?:.*?)(?:\/)?>(.+?)<\/span>(\s*?)/ig;

jsFiddle здесь . Только в IE7 и IE8 это дает результат "не соответствует".

Ответы [ 2 ]

2 голосов
/ 10 ноября 2011

Есть несколько проблем с этим регулярным выражением, худшая из которых заключается в том, что вы, кажется, смешиваете группы захвата и захвата. Как намекнул Майк Самуэль, третья группа захвата - это (\s*?) в самом конце (которая, как и та, что в начале, не имела никакой полезной цели). Попробуйте это регулярное выражение:

/<span\b[^>]*\bclass=\s*(['"]?)forbes_entity\1[^>]*>[\s\S]*?<\/span>/ig

Здесь есть только одна группа захвата; он фиксирует одинарную кавычку, двойную кавычку или ничего. После имени класса \1 снова совпадает с тем же. (Я изменил имя класса, чтобы оно соответствовало образцу текста в вашей скрипке .)

Оказалось, что мне не нужны никакие другие группы, но если бы они мне были нужны, я бы использовал группы без захвата ((?:...)), чтобы было легче отслеживать номера групп захвата. Я также использовал [\s\S] вместо ., чтобы соответствовать содержимому диапазона, если он содержит какие-либо новые строки.

1 голос
/ 10 ноября 2011

\3 выглядит подозрительно, поскольку он никогда не может сопоставить ничего, кроме пустой строки, поскольку за ней следует третья группа захвата. Может ли IE трактовать \3 перед третьей группой захвата как восьмеричный побег, то есть как эквивалент \u0003?

В более старых версиях IE \s имел нестандартное значение - например, он не совпадал с \u00A0.

...