регулярное выражение в разделении строки JavaScript, проблема совместимости браузера - PullRequest
5 голосов
/ 05 мая 2009

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

Я начал достаточно невинно пытаться использовать это выражение для разбиения строки по тегам HTML 'br':

T = captions.innerHTML.split(/<br.*?>/g);

Это работает в любом браузере (FF, Safari, Chrome), кроме IE7 и IE8 с примером ввода текста, подобным этому:

is invariably subjective. <br /> 
The less frequently used warnings (Probably/Possibly) <br /> 

Обратите внимание, что текст примера содержит пробел перед '/' и предшествует новой строке.

Оба следующих параметра будут соответствовать всем тегам HTML в каждом браузере:

T = captions.innerHTML.split(/<.*?>/g);
T = captions.innerHTML.split(/<.+?>/g);

Однако, как ни странно (по крайней мере для меня), этот не работает в FF и Chrome:

T = captions.innerHTML.split(/<br.+?>/g);

Edit:

Это (предлагается несколько раз в ответах ниже) не работает в IE 7 или 8:

T = captions.innerHTML.split(/<br[^>]*>/g);

(Работало на Chrome и FF.)

Мой вопрос: кто-нибудь знает выражение, которое работает во всех текущих браузерах, чтобы соответствовать тегам 'br' выше (но не другим тегам HTML). И может ли кто-нибудь подтвердить, что последний пример выше должен быть действительным совпадением, поскольку в тексте примера перед символом>> присутствуют два символа.

PS - мой тип документа - HTML переходный.

Edit:

Я думаю, у меня есть доказательства, что это относится к поведению string.split () в IE, а не к регулярному выражению в целом. Вы должны использовать split (), чтобы увидеть эту проблему. Я также нашел тестовую матрицу, которая показывает частоту отказов около 30% для тестовых случаев split (), когда я запускал ее в IE. Те же тесты прошли 100% на FF и Chrome:

http://stevenlevithan.com/demo/split.cfm

До сих пор я не нашел решения для IE, и библиотека, предоставленная автором этой тестовой матрицы, не исправила этот случай.

Ответы [ 7 ]

15 голосов
/ 05 мая 2009

Причина, по которой ваш код не работает, заключается в том, что IE анализирует HTML и делает теги заглавными, когда вы читаете его через innerHTML. Например, если у вас есть HTML, как это:

<div id='box'>
Hello<br>
World
</div>

И затем вы используете этот Javascript (в IE):

alert(document.getElementById('box').innerHTML);

Вы получите окно с предупреждением:

Hello<BR>World

Обратите внимание, что <BR> теперь в верхнем регистре. Чтобы это исправить, просто добавьте флаг i в дополнение к флагу g, чтобы регулярное выражение не учитывало регистр, и оно будет работать так, как вы ожидаете.

6 голосов
/ 05 мая 2009

Попробуйте это:

/<br[^>]*>/gi
1 голос
/ 05 мая 2009

вместо

/<br.*?>/

Вы можете попробовать

/<br[^>]*>/

т.е. соответствие "<br", за которым следуют любые символы, кроме '>', за которыми следует '>'.

0 голосов
/ 05 мая 2009

<\ s <em>ш \ s /? \ S *>

совпадений

<br>, <br />, < br >,<br / >

Я тестировал здесь в IE.6. Если марш в порядке, то js может его разделить по регулярному выражению.

0 голосов
/ 05 мая 2009

Протестировано в Firefox 3 и IE7:

/<br.*?>/gi

Попробуйте сами здесь: http://jsbin.com/ofoke

var input = "one <br/>\n" 
          + "two <br />\n" 
          + "three <br>\n" 
; 

alert(input.replace(/<br.*?>/gi, ''));
0 голосов
/ 05 мая 2009

Ну, к сожалению, у меня нет большого количества браузеров на работе (только IE - вздох), но я сразу вижу способ оптимизировать ваше регулярное выражение:

T = captions.innerHTML.split(/<br[^>]*?>/g);

Определение класса встроенных символов [^>] дает указание выражению соответствовать любому символу, КРОМЕ знака больше чем. Вы также можете сделать это без учета регистра (передайте gi в конце, а не просто g).

0 голосов
/ 05 мая 2009

Регулярные выражения в принципе плохо разбирают HTML (см. . Можете ли вы привести некоторые примеры того, почему трудно анализировать XML и HTML с регулярным выражением? , почему). Что вам нужно, это HTML-парсер. См. Можете ли вы привести пример разбора HTML с вашим любимым парсером? для примеров использования различных парсеров.

В частности, вас может заинтересовать ответ JavaScript + DOM .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...