PHP preg_replace все запятые внутри скобок и квадратная скобка

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

Я могу заменить все запятые внутри скобок, используя следующее:

$clean_ingredients = preg_replace('/(\([^)]*),([^)]*\))/', '$1! $2', $ingredients );

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

Чего я хотел бы добиться, так это:

$ingredients = "Skim Milk Powder, Condensed Milk, Coconut Cream, Strawberry Jam [Cane Sugar, Strawberries (40%), Gelling Agent (Fruit Pectin), Acidity Regulator (330)], Hazelnuts, Barley Malt Extract, Emulsifier (Soya Lecithin), Peppermint [Vegetable Oil, Peppermint Oil, Antioxidant (Mixed Tocopherols Concentrate)], Salt, Citric Acid, Flavouring (Vanillin), Vanilla, Colouring (E102, E133, E129, E132, E171, E122, E124, E110, E172, E153).";

$clean_ingredients = preg_replace('????', '$1! $2', $ingredients );

echo $clean_ingredients; 

// Output: Skim Milk Powder, Condensed Milk, Coconut Cream, Strawberry Jam [Cane Sugar! Strawberries (40%)! Gelling Agent (Fruit Pectin)! Acidity Regulator (330)], Hazelnuts, Barley Malt Extract, Emulsifier (Soya Lecithin), Peppermint [Vegetable Oil! Peppermint Oil! Antioxidant (Mixed Tocopherols Concentrate)], Salt, Citric Acid, Flavouring (Vanillin), Vanilla, Colouring (E102! E133! E129! E132! E171! E122! E124! E110! E172! E153).

Есть ли какие-нибудь эксперты по регулярным выражениям, которые знают, что может достичь того, что мне нужно?

Как насчет того, чтобы извлечь часть в скобках, разделить ее на , и затем соединить с !?

InSync 11.05.2023 08:56

Если скобки и квадратные скобки сбалансированы, а предложения в скобках и скобках не являются вложенными, вы можете заменить совпадения ,(?=[^[]*]|[^(]*\)) на '!'. Демо

Cary Swoveland 11.05.2023 11:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
2
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать

<?php

$ingredients = "aaa (1,2,3) bbb [4,5,6,7]";
$clean_ingredients = preg_replace_callback('/\([^()]*\)|\[[^][]*]/', function($m) {return str_replace(',', '! ', $m[0]);}, $ingredients );
echo $clean_ingredients;
// => aaa (1! 2! 3) bbb [4! 5! 6! 7]

Посмотрите демонстрацию PHP и демонстрацию регулярных выражений.

Регулярное выражение \([^()]*\)|\[[^][]*] соответствует

  • \([^()]*\) - символ ( + ноль или более символов, кроме ( и ) + символ )
  • | - или
  • \[[^][]*] - символ [ + ноль или более символов, кроме [ и ] + символ ].

Функция внутри preg_replace_callback заменяет все запятые на ! + пробел.

В {return str_replace(',', '! ', $m[0]);} уберите пробел в конце ! .

l'L'l 11.05.2023 09:19

Работает как мечта для моего сценария. Спасибо!

Jason Stockton 11.05.2023 09:34

@l'L'l Пробел не мой, он есть в строке замены OP, см. $1! $2. Если это нужно ОП, я не могу просто опустить это в ответе.

Wiktor Stribiżew 11.05.2023 10:39

@WiktorStribiżew: после каждого слова полученной строки замены, содержащей «!», был дополнительный пробел. в конце; при пропуске пробела в замене регулярного выражения вывод выглядел точно так же, как и желаемый OP. (например, E102! E133! E129! против E102! E133! E129!)

l'L'l 11.05.2023 11:09

@WiktorStribiżew: я понимаю, в чем проблема; в вашем примере у вас есть (1,2,3...), тогда как у OP есть (1, 2, 3...), и почему лишние пробелы.

l'L'l 11.05.2023 11:22

В этом случае я бы просто заменил str_replace(',', '! ', $m[0]) на preg_replace('~,\s*~', '! ', $m[0]), чтобы добавить один пробел после !.

Wiktor Stribiżew 11.05.2023 11:42
$ingredients = "Skim Milk Powder, Condensed Milk, Coconut Cream, Strawberry Jam [Cane Sugar, Strawberries (40%), Gelling Agent (Fruit Pectin), Acidity Regulator (330)], Hazelnuts, Barley Malt Extract, Emulsifier (Soya Lecithin), Peppermint [Vegetable Oil, Peppermint Oil, Antioxidant (Mixed Tocopherols Concentrate)], Salt, Citric Acid, Flavouring (Vanillin), Vanilla, Colouring (E102, E133, E129, E132, E171, E122, E124, E110, E172, E153).";

echo preg_replace_callback('~\[[^]]+|\([^)]+~', fn($m) => strtr($m[0], ',', '!'), $ingredients);

Другие вопросы по теме