Странная проблема PHP preg_match с символами в шаблоне

Я пытаюсь сопоставить все символы, кроме тех, которые упомянуты в группе исключений, символ в теме «some-text» не является знаком дефиса или минуса, это символ Unicode En Dash «–» (U+2013).

preg_match("/[^↓a-zA-Z0-9" . preg_quote(".\\+*?[^]$(){}=!<>|:#") . "~@%&_;'\",\/ \r\nαβγδθλμπφΔΦΩØ°±≤≥↑∞⁰¹²³⁴⁵⁶⁷⁸⁹₀₁₂₃₄₅₆₇₈₉]/", "some–text");

Приведенный выше код не работает должным образом, возвращает 0 вместо 1.

preg_match("/[^↓a-zA-Z0-9" . preg_quote(".\\+*?[^]$(){}=!<>|:#") . "~@%&_;'\",\/ \r\nαβγδθλμπφΔΦΩØ°±≤≥↑∞⁰¹²³⁴⁵⁶⁷⁸⁹₀₁₂₃₄₅₆₇₈₉]/", "some`text");

В приведенном выше коде, если я изменю символ в теме на обратную галочку, он сработает и вернет 1

preg_match("/[^a-zA-Z0-9" . preg_quote(".\+*?[^]$(){}=!<>|:#") . "~@%&_;'",/ \r\nαβγδθλμπφΔΦΩØ°±≤≥↑∞⁰¹²³⁴⁵⁶⁷⁸⁹₀₁₂₃₄₅₆₇₈₉]/", "some–text");

Если я удалю стрелку вниз ↓ из шаблона и оставлю тире «–» в теме, это начнет работать, и приведенный выше код вернет 1.

preg_match("/[^↓]/", "some–text");

Если я удалю все остальные символы и оставлю в группе исключений только стрелку вниз ↓, это сработает и вернет 1, так что проблема не в символе стрелки вниз.

Может кто-нибудь сказать мне, что происходит, я просто хочу сопоставить все символы, кроме этих

a-zA-Z0-9~@%&_;'\",/ \r\nαβγδθλμπφΔΦΩØ°±≤≥↓↑∞⁰¹²³⁴⁵⁶⁷⁸⁹₀₁₂₃₄₅₆₇₈₉

который включает символы пробела и новой строки \r и \n

Попробуйте использовать модификатор u?

zerkms 29.07.2024 06:31

да, это работает с модификатором u, возможное объяснение?

Aun Rizvi 29.07.2024 06:48
Стоит ли изучать 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 и хотите разрабатывать...
1
2
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Чтобы обрабатывать символы Юникода в PHP, вы должны использовать модификатор «u» в своем регулярном выражении. Кроме того, функция preg_quote экранирует специальные символы в списке исключений, чтобы гарантировать, что они обрабатываются как литералы в шаблоне регулярного выражения.

Следующий код поможет вам сопоставить все символы, кроме тех, которые упомянуты в группе исключений, включая тире.

$exclusions = "a-zA-Z0-9~@%&_;'\",/ \r\nαβγδθλμπφΔΦΩØ°±≤≥↓↑∞⁰¹²³⁴⁵⁶⁷₈₉₀–";
$pattern = "/[^" . preg_quote($exclusions, '/') . "]/u";
$subject = "some–text";

if (preg_match($pattern, $subject)) {
    echo "Matched";
} else {
    echo "Not matched";
}

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

mickmackusa 31.07.2024 07:07

@mickmackusa У этого пользователя низкая репутация в VTC (но он все равно не должен отвечать на дубликаты)

Starship 31.07.2024 07:18

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

Eshban Bahadur 31.07.2024 07:47

@Startship, они не могут пометить закрытие дублей при 500 репутациях?

mickmackusa 31.07.2024 09:00

Дубликаты @Eshban никогда не идентифицируются как обманщики, пока кто-нибудь их не идентифицирует. Практически все основные вопросы по PHP повторяются после 2015 года на сайте Stack Overflow.

mickmackusa 31.07.2024 09:01

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