Как использовать специальные символы регулярных выражений в шаблоне в preg_replace

Пытаюсь заменить 2.0 на стек,

но следующий код заменяет 2008 на 2.08

Ниже приведен мой код:

$string = 'The story is inspired by the Operation Batla House that took place in 2008 ';
$tag = '2.0';
$pattern = '/(\s|^)'.($tag).'(?=[^a-z^A-Z])/i';
echo preg_replace($pattern, '2.0', $string);

Что вы имеете в виду под I am trying to replace 2.0 to stack,? Я не вижу stack в строке. Что вы хотите сопоставить и заменить? Ваш шаблон будет (\s|^)2.0(?=[^a-z^A-Z]), который в текущей строке будет соответствовать пробелу, 2, любому символу из-за точки и 0.

The fourth bird 13.07.2019 15:25

Я бы использовал обратную косую черту, чтобы убрать точку $tag = '2.\0';

Emilio Borraz 13.07.2019 21:03
Стоит ли изучать 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 и хотите разрабатывать...
1
2
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

$string = 'The story is inspired by the Operation Batla House that took place in 2008 ';
$tag = '2.0';
$pattern = '/(\s|^)' . preg_quote($tag, '/') . '(?=[^a-zA-Z])/i';
//                     ^^^^^^^^^^^^^^^^^^^^^
echo preg_replace($pattern, '2.0', $string);

Строка не изменена. См. демонстрация PHP. Разделителем регулярного выражения здесь является /, поэтому он передается вторым параметром в preg_quote.

Обратите внимание, что [^a-z^A-Z] соответствует любым символам, кроме букв ASCII и ^, поскольку вы добавили второй ^ в класс символов. Я изменил [^a-z^A-Z] на [^a-zA-Z].

Кроме того, группа захвата в начале может быть заменена одним просмотром назад, (?<!\S) это обеспечит совпадение только в начале строки или после пробела.

Если вы ожидаете совпадения в конце строки, замените (?=[^a-zA-Z]) (для этого требуется символ, отличный от буквы, непосредственно справа от текущего местоположения) на (?![a-zA-Z]) (для этого требуется символ, отличный от буквы или конец строки, непосредственно справа от текущее местоположение).

Итак, используйте

$pattern = '/(?<!\S)' . preg_quote($tag, '/') . '(?![a-zA-Z])/i';

Кроме того, рассмотрите возможность использования однозначных границ слов

$pattern = '/(?<!\w)' . preg_quote($tag, '/') . '(?!\w)/i';

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