регулярное выражение в разделении строки javascript, проблема с совместимостью браузера
-
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, безусловно, может разделить его в соответствии с регулярным выражением.