Как найти в тексте все несоответствующие символы данному регулярному выражению

Как найти на PHP в тексте все символы, не соответствующие данному регулярному выражению

/^[a-zA-Z0-9_~!$^().-]+$|^[а-яА-ЯёЁ0-9_~!$^().-]+$/isu

Например, есть строка login41;23. Как можно получить несоответствующий символ ;?


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

Вы можете использовать отрицающий (негативный) символьный класс,

if (preg_match_all('/[^\w~!$^().-]+/u', 'login;№н гин4123', $matches)) {
    var_dump($matches[0]);
}
// array(2) {  [0]=> string(4) ";№"  [1]=> string(1) " " }

См. пример работы кода онлайн.

Обратите внимание, \w находит все буквы (и русские, и английские, и другие, так как здесь использован модификатор u), цифры и знак подчёркивания, а в отрицающем символьном классе, соответственно, находит все символы, отличные от приведённых выше.

→ Ссылка