Регулярное выражение Javascript - почему это не работает, как ожидалось в IE? - PullRequest
1 голос
/ 21 мая 2009

После долгого сна я все еще не могу понять:

Приведенный ниже код (его упрощение по сравнению с большим кодом, который показывает только проблему) Идентифицирует Item1 и Item2 в FF, но не в IE7. Я невежественен.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>

<body>
<table><tr>
<td><img src=imgs/site/trash.jpg border=1></td><td><font style="">Item1</font></td>
<td><img src=imgs/site/trash.jpg border=1></td><td><font style="">Item2</font></td>
</tr></table>

<script type="text/javascript">
    var _pattern =/trash.*?<font.*?>(.*)<\/font>/gim;
    alert (_pattern);

    var thtml = document.documentElement.innerHTML;
    alert (thtml);
    while ( _match =_pattern.exec(thtml)){
        alert (_match[1]);

    }

</script>

</body>
</html>

Примечания: 1. Я знаю, что есть лучшие способы получить Item1 и Item2. этот пример для демонстрации проблемы Regex, с которой я сталкиваюсь самым простым способом. 2. Когда я удаляю теги table и / table, он работает.

Заранее спасибо

Ответы [ 4 ]

3 голосов
/ 21 мая 2009

Серьезно, это ужасно. Решение на основе getElementById / getElementsByTagName будет значительно более надежным и гибким.

Что касается самой проблемы, то, вероятно, это связано с тем, что поддержка многострочных регулярных выражений javascript небезопасна для x-браузера и, в частности, IE имеет проблемы. Удаление объявления таблицы, вероятно, заставит IE внутренне отформатировать оставшуюся разметку в одну строку (= успех), где его добавление обратно заставит IE добавить возврат каретки и т. Д. (= Сбой).

Я знаю, что вы сказали, что знаете, что есть лучшие способы, но вы не объяснили, почему вы будете настаивать на этом. Полагаясь на регулярное выражение и далее полагаясь на интерпретацию DOM в виде открытого текста IE, вы столкнетесь с такими проблемами. Не делай этого.

1 голос
/ 21 мая 2009

Проблема в том, что многострочная реализация JScripts глючит. Это не позволяет любой символ. соответствовать символу новой строки.

Используйте это регулярное выражение вместо: -

 var _pattern = /trash[\s\S]*?<font[^>]*>([^<]*)<\/font>/gi;

Это исключает. в целом, примечание [\ s \ S] эквивалентно, но будет соответствовать новой строке.

Причиной, по которой удаление таблицы что-то меняет, является реализация IE .innerHTML, которая не зависит от полученной исходной разметки Вместо этого разметка создается динамически путем изучения DOM. Когда он видит элемент таблицы, он помещает новые строки в вывод в разных местах, чем когда таблица отсутствует.

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

Конечные теги td имеют символ, который необходимо экранировать: / slash. Я не знаю, именно поэтому IE7 срабатывает. Safari в порядке, как проверено.

Возможно, вы захотите добавить идентификатор в таблицу. Затем просто перебирайте только дочерние узлы таблицы. Вы бы использовали намного меньше HTML на большей странице и, возможно, сэкономили бы память.

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

Попробуйте построить регулярное выражение с new RegExp("", "gim"). Это более портативный.

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