Простая ошибка с регулярным выражением PHP

Создайте файл test.php и запустите приведенный ниже код (сохраните файл с кодировкой UTF-8).

echo preg_replace("/./","X","Á");

Вы получите XX (он должен вернуть только один X, но вот и первая ошибка). PHP делает какие-то странные вещи с многобайтовыми числами.

Теперь запустите этот код:

echo preg_replace("/.$/","X","Á");

Вы получите �X. Это связано с ошибкой выше, но по какой-то причине первый символ повреждается.

В любом случае, есть ли простой способ решить эту проблему? Мое текущее регулярное выражение намного сложнее, чем приведенное выше, конечно, вышеизложенное бесполезно, но это минимум для воспроизведения ошибки.

Какая версия PHP?

Paul T. 31.08.2024 04:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Проблема возникает потому, что функция preg_replace заменяет каждый символ во входной строке на "X". Символ "Á" рассматривается в PHP как многобайтовый символ, то есть он хранится в памяти как более одного байта (или части).

Когда preg_replace использует шаблон "/./", он соответствует каждому байту отдельно, а не всему "Á" символу. Таким образом, вместо замены "Á" на один "X", он заменяет каждую часть (байт) "Á" на "X", в результате чего получается "XX".

Чтобы исправить это, вам следует использовать регулярное выражение, которое работает с многобайтовыми символами. Так

echo preg_replace("/./u", "X", "Á");

Объяснение: добавление модификатора u указывает PHP обрабатывать строку как UTF-8.

Проблема со вторым кодом аналогична первой. Вот исправление для этого.

echo preg_replace("/.$/u", "X", "Á");

Онлайн исполнение: https://3v4l.org/RLYma

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