str = str.replace(/abc/g, '');
В ответ на комментарий:
var find = 'abc'; var re = new RegExp(find, 'g'); str = str.replace(re, '');
В ответ на комментарий Click Upvote вы можете упростить его еще больше:
function replaceAll(str, find, replace) { return str.replace(new RegExp(find, 'g'), replace); }
Примечание. Регулярные выражения содержат специальные (мета) символы и, как таковые, опасно слепо передавать аргумент в функции
find
выше, не предварительно обработав его, чтобы избежать этих символов. Это описано в Справочнике JavaScript Mozilla Developer Network по регулярным выражениям , где они представляют следующую функцию полезности:function escapeRegExp(str) { return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"); }
Итак, в чтобы сделать функцию
replaceAll()
выше безопасной, ее можно было бы изменить следующим образом, если вы также включилиescapeRegExp
:function replaceAll(str, find, replace) { return str.replace(new RegExp(escapeRegExp(find), 'g'), replace); }
В регулярном выражении вы можете «захватить» части согласованной строки с помощью (brackets)
; в этом случае вы захватываете (^|_)
и ([a-z])
части матча. Они нумеруются начиная с 1, поэтому у вас есть обратные ссылки 1 и 2. Матч 0 - это вся строка с согласованием.
Модификатор /e
принимает заменяющую строку и заменяет обратную косую черту с последующим номером ( например, \1
) с соответствующей обратной ссылкой, но поскольку вы находитесь внутри строки, вам нужно избежать обратной косой черты, чтобы вы получили '\\1'
. Затем он (эффективно) запускает eval
, чтобы запустить результирующую строку, как если бы это был PHP-код (поэтому он устарел, потому что его легко использовать eval
небезопасным способом).
Функция preg_replace_callback
вместо этого выполняет функцию обратного вызова и передает ей массив, содержащий совпадающие обратные ссылки. Итак, где бы вы написали '\\1'
, вместо этого вы получите доступ к элементу 1 этого параметра - например. если у вас есть анонимная функция формы function($matches) { ... }
, первая обратная ссылка - $matches[1]
внутри этой функции.
Итак, аргумент /e
в
'do_stuff(\\1) . "and" . do_stuff(\\2)'
может стать обратным вызовом
function($m) { return do_stuff($m[1]) . "and" . do_stuff($m[2]); }
. Или в вашем случае
'strtoupper("\\2")'
может стать
function($m) { return strtoupper($m[2]); }
Обратите внимание, что $m
и $matches
не являются волшебными именами, это просто имя параметра, которое я дал при объявлении моих функций обратного вызова. Кроме того, вам не нужно передавать анонимную функцию, это может быть имя функции в виде строки или что-то вроде формы array($object, $method)
, как с любым обратным вызовом в PHP , например
function stuffy_callback($things) {
return do_stuff($things[1]) . "and" . do_stuff($things[2]);
}
$foo = preg_replace_callback('/([a-z]+) and ([a-z]+)/', 'stuffy_callback', 'fish and chips');
Как и в любой функции, вы не можете получить доступ к переменным вне вашего обратного вызова (из окружения) по умолчанию. При использовании анонимной функции вы можете использовать ключевое слово use
для импорта переменных, которые вам нужны для доступа, , как описано в руководстве по PHP . например если старый аргумент был
'do_stuff(\\1, $foo)'
, тогда новый обратный вызов может выглядеть как
function($m) use ($foo) { return do_stuff($m[1], $foo); }
preg_replace_callback
- вместо модификатора /e
в регулярном выражении, поэтому вам нужно удалить этот флаг из вашего аргумента «pattern». Таким образом, шаблон, подобный /blah(.*)blah/mei
, станет /blah(.*)blah/mi
. /e
использовал внутри аргумента addslashes()
вариант, поэтому некоторые замены использовали stripslashes()
для его удаления; в большинстве случаев вы, вероятно, хотите удалить вызов stripslashes
из вашего нового обратного вызова.