Я вижу, что вы уже приняли другой ответ, но я хочу объяснить, почему ваши попытки с регулярным выражением не сработали. Надеюсь, это поможет вам.
Во-первых, я замечаю ereg в ваших тегах на этот вопрос. Обратите внимание, что функции PHP ereg_
устарели; Вы должны использовать только функции preg_
.
Теперь, если вы хотите использовать регулярные выражения для такого рода вещей, вы, как правило, используете отрицательный класс символов, чтобы определить список символов, которые вы хотите разрешить, а затем ищите что-нибудь еще.
Класс символов - это список символов, заключенный в квадратные скобки. Вы можете отменить класс персонажа, добавив символ карата в его начало. Поэтому, если вам нужна строка, содержащая только «A», «B» или «C», и вы хотите получать предупреждения о строках, которые содержат что-то еще, вы можете использовать что-то вроде этого:
$result = preg_match("/[^ABC]/",$mystring);
Ваш пример в основном такой же (но с большим количеством символов для тестирования, очевидно), за исключением двух моментов: во-первых, в вашем списке есть символы, которые являются зарезервированными символами в Regex, а во-вторых, вы используете символы не-Ascii.
С зарезервированными символами Regex можно бороться, избегая их с помощью обратной косой черты. Вам просто нужно знать, какие символы зарезервированы. Глядя на ваш список, я вижу ?
, /
, .
и +
.
Второй пункт объясняет, почему вы не можете заставить его работать с ereg
, потому что функции ereg
не поддерживают юникод. Вместо этого переключитесь на использование функций preg
, и вам повезет больше.
Вам все еще нужно указать движку регулярных выражений, что вы ищете символы Юникода. Это делается путем добавления модификатора u
в конец строки регулярного выражения.
Таким образом, сокращенная версия вашего запроса может выглядеть следующим образом:
$result = preg_match("/[^èΛ¤4DTdt]/u",$mystring);
Похоже, что вы включаете новые строки в свой список символов, поэтому вы также можете добавить многострочный модификатор m
вместе с этим u
.
Для символов, которые не могут быть написаны (или даже для любого символа, если это проще), вы можете добавить escape-последовательности для их кодов символов Unicode. Используйте \uFFFF
, где FFFF
- шестнадцатеричная ссылка на юникод для символа, которому вы хотите соответствовать - например, \u00E0
соответствует à
.
Надеюсь, это поможет вам лучше понять регулярные выражения. Я должен добавить, что я не говорю, что регулярное выражение - это обязательно лучшее решение этого вопроса и не обязательно единственное решение. Я попытался заставить его работать оптимально, используя класс отрицательных символов (что означает, что он потерпит неудачу, как только найдет несоответствующий символ, и должен предотвратить чрезмерный возврат к исходному виду, который иногда может привести к тому, что выражения регулярного выражения будут довольно медленными ), поэтому он должен быть достаточно производительным, но я не проверял его на других решениях.
Надеюсь, это поможет.