Как заменить блок текста специальными символами с помощью preg_replace PHP

Я использую следующее:

$pattern_array = array();
$replace_array = array();
$pattern_array[] = '#\[vc_row][vc_column width = "1/2" css = ".vc_custom_1503896034143{margin-bottom: 40px !important;}"][shortcode_testimonials_carousel#i';
$replace_array[] = '[vc_row fixed_width = "true"][vc_column width = "1/2" css = ".vc_custom_1503896034143{margin-bottom: 40px !important;}"][shortcode_testimonials_carousel';
echo preg_replace($pattern_array, $replace_array, $content);

Чтобы заменить этот текст:

[vc_row][vc_column width = "1/2" css = ".vc_custom_1503896034143{margin-bottom: 40px !important;}"][shortcode_testimonials_carousel

С этим текстом:

[vc_row fixed_width = "true"][vc_column width = "1/2" css = ".vc_custom_1503896034143{margin-bottom: 40px !important;}"][shortcode_testimonials_carousel

Но получаю ошибку:

preg_replace(): Compilation failed: range out of order in character class at offset 69

Мне не нужны никакие правила регулярных выражений или что-то еще, я просто хочу заменить один блок текста другим, игнорируя все [квадратные скобки] и «кавычки», есть ли способ сделать это с помощью preg_replace?

Кстати, я знаю, что могу использовать str_replace, но я добавляю это в функцию, которая перебирает массив и уже использует preg_replace, поэтому str_replace не вариант.

ПОЧЕМУ вы используете preg_replace для статической замены?

Andreas 05.10.2018 07:20

Прочтите последнее предложение в моем вопросе

The Bobster 05.10.2018 07:21

Неважно. Вы так зацикливаетесь? Это по-прежнему str_replace, который вам нужен. Используйте правильный инструмент.

Andreas 05.10.2018 07:23

Получаете ли вы что-нибудь, размещая такие бесполезные ответы? Если вы не знаете решения, зачем вообще отвечать?

The Bobster 05.10.2018 07:35

@Andreas Я думаю, он говорит, что другие элементы массива не являются статическими заменами, и он пытается использовать один и тот же метод для всех из них.

Barmar 05.10.2018 07:35

Именно Бармар, место на

The Bobster 05.10.2018 07:35

На мой взгляд, это все еще не повод использовать не тот инструмент. Str_replace будет работать быстрее, поэтому лучше использовать статические замены в str_replace и динамические в preg_replace. По-прежнему выполняется то же количество вызовов функций, только один способ быстрее другого.

Andreas 05.10.2018 09:12

Если мне придется снова перебрать все данные, чтобы использовать str_replace, что будет быстрее? Я так не думаю. Если это «неправильный инструмент», для чего нужна функция preg_quote?

The Bobster 05.10.2018 09:15

Не будь придурком. Дело не в том, чтобы дважды повторять одни и те же значения. Ваш pattern_array должен быть разделен на две части. Один со статикой, а другой с динамикой. Например, скажем, это 3 + 3. Это означает, что вы запускаете str_replace на трех и preg_replace на трех. И да, это быстрее и использует меньше памяти, так как вы не используете все накладные расходы функций preg. И preg_quote не предполагается использовать в качестве патча для плохо написанного кода. Он экранирует символы регулярных выражений, но правильно сделанный код работает без preg_quote.

Andreas 05.10.2018 09:57

Я не могу использовать str_replace, я четко упомянул об этом в своем вопросе. Кароль Самборски уже отлично решил проблему, так что я, честно говоря, не уверен, что вы пытаетесь получить в данный момент.

The Bobster 05.10.2018 10:48

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

Andreas 05.10.2018 12:55

Посмотрите здесь смесь str_replace и preg_replace, что, как вы говорите, невозможно. 3v4l.org/hR9rF

Andreas 05.10.2018 13:08
Стоит ли изучать 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
12
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вам просто нужно экранировать специальные символы, используемые в регулярных выражениях. Есть замечательная функция под названием preg_quote, которая сделает это автоматически.

$pattern_array = array();
$replace_array = array();
$pattern_array[] = '#' . preg_quote('[vc_row][vc_column width = "1/2" css = ".vc_custom_1503896034143{margin-bottom: 40px !important;}"][shortcode_testimonials_carousel', '#') . '#i';
$replace_array[] = '[vc_row fixed_width = "true"][vc_column width = "1/2" css = ".vc_custom_1503896034143{margin-bottom: 40px !important;}"][shortcode_testimonials_carousel';
echo preg_replace($pattern_array, $replace_array, $content);

Хорошо, я понятия не имел о существовании preg_quote, большое спасибо за проницательный ответ

The Bobster 05.10.2018 07:32

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