2012-04-10 3 views
0

, почему это не работаетрегулярное выражение заменить метод JS не работает

var value = arr[row][col].replace(new RegExp('"', 'g'),'""'); 

Ошибка: Webpage сведения об ошибках

Агент пользователя: Mozilla/4.0 (совместимый; MSIE 8.0; Windows NT 6.1 , Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; Tablet PC 2.0) Временная метка: Вт, 10 апреля 2012 г. 11 : 22: 01 UTC

Сообщение: Объект не поддерживает порт это свойство или метод Линия: 1041 Char: 25 Код: 0 URI: http://example.com/?

Сообщение: Объект не поддерживает это свойство или метод Line: 1041 Char: 25 Код: 0 URI : http://example.com/?

Сообщение: Объект не поддерживает это свойство или метод Line: 1041 Char: 25 Код: 0 URI : http://example.com/?

Примечание:: Ошибка копируется непосредственно из отладчика IE8

+0

... А что в этих показателях? Задайте полный вопрос. –

+0

Сэр, он содержит строковое значение. – Krishna

+0

@ user950146 '' ''является строковым значением. – alex

ответ

2

две причины: вы не заменяющие вхождений подстроки, но пытаются использовать методы манипуляции строками на DOM-элемент. Лучше сделать что-то вроде этого:

var value = arr[row][col].innerHTML.replace(new RegExp('"', 'g'),'""'); 

Но я действительно не поклонник регулярных выражений в этом случае (я люблю Regex, но только тогда, когда это необходимо). Я бы заменить все " с "" так:

var value = arr[row][col].innerHTML.split('"').join('""'); 

Быстрее, легче читать, и дает тот же результат. Хотя нужно иметь в виду: если исходная строка уже содержит двойные кавычки (""), они будут увеличены в четыре раза. Если это возможный сценарий, вам нужно регулярное выражение, как это:

var value = arr[row][col].innerHTML.replace(/(?:[^"]"(?:[^"]))/g,'""'); 

Это будет соответствовать только цитаты, которые не являются ни предшествуют цитаты, ни следовали один ... Выберите любой из перечисленных выше решений, но помните, : если вы решили использовать первый вариант, исследования показали, что у вас на 50% больше шансов иметь меньше друзей ;-).

+0

Thnx Elias за то, что помог мне. Думаю, я обнаружил проблему. Так или иначе, объект передавался как значение в цикле строковых значений. Я использовал ключевое слово «typeof» для фильтрации таких объектов, и теперь он работает. – Krishna

+1

Я не согласен с утверждением читаемости, потому что это хак, который скрывает намерение кода. Кроме того, я не могу создать тестовый пример, где .split последовательно быстрее. Я бы пошел на 'var r = /"/g; ..loop .. {t.replace (r, '""');} '. – Bergius

+0

Дальнейшее тестирование указывает, что' ..loop .. {t.replace (/"/г, '""'); } 'будет наиболее эффективным способом для этого.По-видимому, браузерные JS-движки в наши дни довольно умны :). – Bergius