Как обработать строку с помощью preg_replace и preg_quote (без учета регистра)?

У меня есть текст:

Curabitur nec bibendum erat. Sed a scelerisque arcu, facilisis bibendum mauris. Mauris sed sapien volutpat, volutpat risus in, bibendum odio. Vestibulum eget neque a lorem CURABITUR rhoncus. Aenean mollis ipsum ut facilisis egestas. Pellentesque finibus sed ante eget interdum. Nunc fringilla ante a egestas mattis. Sed tincidunt libero a dapibus bibendum. Morbi ac sapien vehicula, condimentum justo eget, curabitur nisl. Cras rutrum molestie diam, ac maximus mauris auctor quis. Ut vel diam nunc. Aliquam auctor, magna ac finibus fermentum, orci libero consectetur magna, id scelerisque tellus sem et orci.

В PHP я хотел бы обернуть слово «curabitur» тегом <mark> как <mark>$1</mark>, используя нечувствительный регистр.

Этот следующий код работает:

return preg_replace("/(" . $needle . ")/mi", "<mark>$1</mark>", $haystack );

Выход :

<mark>Curabitur</mark> nec bibendum erat. Sed a scelerisque arcu, facilisis bibendum mauris. Mauris sed sapien volutpat, volutpat risus in, bibendum odio. Vestibulum eget neque a lorem <mark>CURABITUR</mark> rhoncus. Aenean mollis ipsum ut facilisis egestas. Pellentesque finibus sed ante eget interdum. Nunc fringilla ante a egestas mattis. Sed tincidunt libero a dapibus bibendum. Morbi ac sapien vehicula, condimentum justo eget, <mark>curabitur</mark> nisl. Cras rutrum molestie diam, ac maximus mauris auctor quis. Ut vel diam nunc. Aliquam auctor, magna ac finibus fermentum, orci libero consectetur magna, id scelerisque tellus sem et orci.

НО, если у вас есть этот текст:

[Curabitur] nec bibendum erat. Sed a scelerisque arcu, facilisis bibendum mauris. Mauris sed sapien volutpat, volutpat risus in, bibendum odio. Vestibulum eget neque a lorem [CURABITUR] rhoncus. Aenean mollis ipsum ut facilisis egestas. Pellentesque finibus sed ante eget interdum. Nunc fringilla ante a egestas mattis. Sed tincidunt libero a dapibus bibendum. Morbi ac sapien vehicula, condimentum justo eget, [curabitur] nisl. Cras rutrum molestie diam, ac maximus mauris auctor quis. Ut vel diam nunc. Aliquam auctor, magna ac finibus fermentum, orci libero consectetur magna, id scelerisque tellus sem et orci.

и $needle = [curabitur] вы должны использовать preg_quote() для экранирования символов [,]

Однако следующее работает НЕТ:

return preg_replace("/(" . preg_quote( $needle ) . ")/mi", "<mark>$1</mark>", $haystack );

потому что $1 был изменен preg_quote().

Как я могу решить это?

Что вы подразумеваете под $1 был изменен preg_quote()? Он изменен так, чтобы механизм регулярных выражений мог анализировать его как обычный текст. У вас нет проблем для решения.

Wiktor Stribiżew 06.06.2019 14:51
Стоит ли изучать 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 и хотите разрабатывать...
0
1
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Только что протестировал его без preg_quote, но с помощью желаемой иглы, и он работает как шарм:

$haystack = "[Curabitur] nec bibendum erat. Sed a scelerisque arcu, facilisis bibendum mauris. Mauris sed sapien volutpat, volutpat risus in, bibendum odio. Vestibulum eget neque a lorem CURABITUR rhoncus. Aenean mollis ipsum ut facilisis egestas. Pellentesque finibus sed ante eget interdum. Nunc fringilla ante a egestas mattis. Sed tincidunt libero a dapibus bibendum. Morbi ac sapien vehicula, condimentum justo eget, curabitur nisl. Cras rutrum molestie diam, ac maximus mauris auctor quis. Ut vel diam nunc. Aliquam auctor, magna ac finibus fermentum, orci libero consectetur magna, id scelerisque tellus sem et orci.";
$needle = "curabitur";

echo preg_replace("/(\[" . $needle . "\])/mi", "<mark>$1</mark>", $haystack );

Результат:

<mark>[Curabitur]</mark> nec bibendum erat. Sed a scelerisque arcu, facilisis bibendum mauris. Mauris sed sapien volutpat, volutpat risus in, bibendum odio. Vestibulum eget neque a lorem CURABITUR rhoncus. Aenean mollis ipsum ut facilisis egestas. Pellentesque finibus sed ante eget interdum. Nunc fringilla ante a egestas mattis. Sed tincidunt libero a dapibus bibendum. Morbi ac sapien vehicula, condimentum justo eget, curabitur nisl. Cras rutrum molestie diam, ac maximus mauris auctor quis. Ut vel diam nunc. Aliquam auctor, magna ac finibus fermentum, orci libero consectetur magna, id scelerisque tellus sem et orci.

Я просто экранировал скобки обратной косой чертой \[ (см. пример, это то, что в основном должно делать preg_quote().

Затем я попытался с:

$needle = preg_quote("[curabitur]");
echo preg_replace("/(" . $needle . ")/mi", "<mark>$1</mark>", $haystack );

КЭД. Работает как часы. Вашей проблемы не существует, код работает.

Да, это работает. проблема была во время предыдущего лечения. Мне жаль.

J.BizMai 06.06.2019 15:47

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