Пытаюсь заменить 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);
Я бы использовал обратную косую черту, чтобы убрать точку $tag = '2.\0';






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