Ответ 1
[
и ]
- специальные символы в регулярном выражении. Они используются для перечисления символов матча. [az]
соответствует любой строчной букве между a
и z
. [03b]
соответствует "0", "3" или "b". Чтобы соответствовать символам [
и ]
, вы должны экранировать их с предшествующим \
.
Ваш код в настоящее время говорит "замените любой символ []().
Пустой строкой" (для ясности переупорядочен в том порядке, в котором вы их напечатали).
Жадный матч:
preg_replace('/\[.*\]/', '', $str); // Replace from one [ to the last ]
Жадное совпадение может соответствовать нескольким [s и] s. Это выражение взяло an example [of "sneaky"] text [with more "sneaky"] here
и превратило бы его в an example here
.
В Perl есть синтаксис для несжадного соответствия (вы, скорее всего, не хотите быть жадным):
preg_replace('/\[.*?\]/', '', $str);
Нежадные спички стараются поймать как можно меньше символов. Используя тот же пример: an example [of "sneaky"] text [with more "sneaky"] here
становится an example [of "sneaky"] text [with more "sneaky"] here
an example text here
.
Только до первого следующего]:
preg_replace('/\[[^\]]*\]/', '', $str); // Find a [, look for non-] characters, and then a ]
Это более явно, но труднее читать. Используя тот же пример текста, вы получите вывод не жадного выражения.
Обратите внимание, что ни один из них не имеет дело с пробелами. Пробелы по обе стороны от [
и ]
останутся.
Также обратите внимание, что все они могут потерпеть неудачу из-за неправильного ввода. Многократное [
и ]
без совпадений может привести к неожиданному результату.