Удалять парантезы, только если внутри персонажей более одного - PullRequest
0 голосов
/ 25 марта 2020

Я хочу удалить парантезы, только если внутри них более одного символа текста.

Мой ввод:

$string = "Model name (4) Color (Additional Params)"

Моя конечная строка должна быть следующей: «Название модели (4) Цвет Дополнительные параметры».

Мое решение:

  1. Определить необходимую область с помощью Regex \([^)]{2,}\).
  2. Вырежьте его из исходной строки.
  3. Удалите парантезы.
  4. Присоедините обратно к исходной строке.

Я знаю, что регулярные выражения имеют условные выражения. Но я не могу понять логи c их использования.

Можно ли это сделать с одним регулярным выражением и как?

1 Ответ

0 голосов
/ 25 марта 2020

Можно сделать с одним регулярным выражением:

$string = 'Model name (4) Color (Additional Params) and some other (a) with more (params)';
$modifiedString = preg_replace('/\(([^\(\)]{2,})\)/', '$1', $string);
var_dump($modifiedString);

Это даст:

string (74) "Название модели (4) Цвет Дополнительные параметры и некоторые другие (a) с большим количеством параметров "

Шаблон объяснил:

  • \( - соответствует открывающей литеральной скобке
  • [^\(\)] - соответствует любому символу, который не является открывающей или закрывающей скобкой (нам нужно сделать это, чтобы она не соответствовала всему между первой открывающей и последней закрывающей скобкой - (4) Color (Additional Params))
  • за ней следует квантификатор {2,}, говорящий мы хотим сопоставить два или более из этих
  • вместе с квантификатором, заключенным в скобки, образуя группу захвата : ([^\(\)]{2,}) - это позволит получить все содержимое скобок в строка
  • наконец мы сопоставляем \) буквально закрывающие скобки

Второй параметр в вызове preg_replace определяет замену нашего полного соответствия (Additional params) на группу захвата Additional params.

...