Единственный способ, который работает для меня, это: (требуется jQuery)
$(document).ready(function(e) {
if ($.browser.webkit) {
$('#input_id').val(' ').val('');
}
});
Ваша главная проблема в жадном жетоне ((?!\[\/\1\]).)*?
.
Во-первых, это неэффективно, поскольку вы определяете его количественно, а затем количественно определяете всю группу, в которой он находится, поэтому движок регулярных выражений ищет дополнительные способы сопоставления строки, и это делает ее довольно хрупкой.
Во-вторых, вы соответствуете только закрывающему тегу и не ограничивает начальный тег. Первый шаг - сделать /
перед \1
необязательным, \/?
. Он не остановится до [tag]
, как теги без атрибутов. Чтобы добавить поддержку атрибутов, добавьте необязательную группу после \1
, (?:\s[^]]*)?
. Он соответствует необязательной последовательности пробелов, а затем любых 0+ символов, кроме ]
.
Фиксированное регулярное выражение будет иметь вид
\[([biu]|h[123]|l(?:arge|ist)|small|table|grid)](?:(?!\[/?\1(?:\s[^]]*)?]).|(?R))*\[/\1]
Не забудьте скомпилировать его с regex.DOTALL
, чтобы оно совпадало с несколькими символами новой строки.