Ваш код заставляет браузер выполнять много повторяющихся, потраченных впустую работ. Подход, который вы должны использовать, заключается в следующем:
- Придумайте регулярное выражение, которое объединяет все ваши "целевые" регулярные выражения с другим, которое соответствует ведущей строке символов, которые не ваши специальные метасимволы.
- Измените цикл так, чтобы он делал следующее:
- Получить следующее совпадение из исходной строки. Это совпадение, из-за того, как вы изменили свое регулярное выражение, будет строкой немета-символов, за которыми следует ваша совпавшая часть.
- Добавить немета-символы и замену целевой части в отдельный массив строк.
- В конце этого процесса отдельный массив аккумуляторов может быть объединен и использован для замены содержимого.
Что касается того, как комбинировать регулярные выражения, ну, в JavaScript это не очень красиво, но выглядит так. Во-первых, вам нужно регулярное выражение для строки из нуля или более «неинтересных» символов. Это должно быть первой группой захвата в регулярном выражении. Далее должны быть альтернативы для целевых строк, которые вы ищете. Таким образом, общая форма:
var tokenizer = /(uninteresting pattern)?(?:(target 1)|(target 2)|(target 3)| ... )?/;
Когда вы сопоставите это с исходной строкой, вы получите массив результатов, который будет содержать следующее:
result[0] - entire chunk of string (not used)
result[1] - run of uninteresting characters
result[2] - either an instance of target type 1, or null
result[3] - either an instance of target type 2, or null
...
Таким образом, вы узнаете, какую цель замены вы видели, проверив, какие целевые регулярные выражения не пусты. (Обратите внимание, что в вашем случае цели могут предположительно перекрываться; если вы намерены, чтобы это сработало, то вам придется подходить к этому как к полной проблеме анализа, я подозреваю.)