регулярное выражение в разделении строки javascript, проблема с совместимостью браузера

StackOverflow https://stackoverflow.com/questions/822454

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Я начал достаточно невинно пытаться использовать это выражение для разделения строки на 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);

Редактировать:

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

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

(Это действительно работало в Chrome и FF.)

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

PS - мой doctype - это HTML transitional.

Редактировать:

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Hello<BR>World

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

Другие советы

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

/<br[^>]*>/gi

Вместо

/<br.*?>/

вы могли бы попробовать

/<br[^>]*>/

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

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

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

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

Протестировано в 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, ''));

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

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

<\sbr\s/?\s*>

Матчи

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top