Как убрать квадратные скобки и что-нибудь между ними с помощью регулярного выражения? - PullRequest
24 голосов
/ 02 марта 2010

Как удалить текст между квадратными скобками и самими скобками?

Например, мне нужно:

hello [quote="im sneaky"] world

стать:

hello world

Вот что я пытаюсь использовать, но это не помогает:

preg_replace("/[\[(.)\]]/", '', $str);

Я только что закончил с:

hello quote="im sneaky" world

Ответы [ 3 ]

34 голосов
/ 02 марта 2010

[ и ] - специальные символы в регулярном выражении. Они используются для перечисления символов матча. [a-z] соответствует любой строчной букве между 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 text here.


Только до первого следующего]:

preg_replace('/\[[^\]]*\]/', '', $str); // Find a [, look for non-] characters, and then a ]

Это более явно, но сложнее для чтения. Используя тот же текст в качестве примера, вы получите вывод не жадного выражения.


Обратите внимание, что ни одно из них не имеет прямого отношения к пробелу. Пробелы по обе стороны от [ и ] останутся.

Также обратите внимание, что все они могут не работать из-за неправильного ввода. Несколько [ с и ] с без совпадений могут привести к неожиданному результату.

8 голосов
/ 20 ноября 2012

На всякий случай, если вы ищете рекурсивное удаление:

$str = preg_replace("/\[([^\[\]]++|(?R))*+\]/", "", $str);

Это преобразует это:

Это [текст [больше текста]] круто

к этому:

Это круто

1 голос
/ 02 марта 2010

Я думаю, что вы на самом деле хотите, чтобы у вас были скобки для внешних скобок, поскольку это группа. квадратные скобки представляют собой ряд выражений. Не уверен, как набрать его в SO.

/(\\[.*\\])/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...