Я пытаюсь сопоставить все символы, кроме тех, которые упомянуты в группе исключений, символ в теме «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, возможное объяснение?
Чтобы обрабатывать символы Юникода в 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 У этого пользователя низкая репутация в VTC (но он все равно не должен отвечать на дубликаты)
Позже выяснилось, что это дубликат сообщения. Позабочусь в следующий раз.
@Startship, они не могут пометить закрытие дублей при 500 репутациях?
Дубликаты @Eshban никогда не идентифицируются как обманщики, пока кто-нибудь их не идентифицирует. Практически все основные вопросы по PHP повторяются после 2015 года на сайте Stack Overflow.
Попробуйте использовать модификатор
u
?