Regex, кодировка и символы, которые похожи - PullRequest
2 голосов
/ 24 марта 2010

Во-первых, краткий пример, допустим, у меня есть это регулярное выражение "/ [0-9] {2} ° /" и этот текст "24º". Текст не будет совпадать, конечно ... (?) Это зависит от шрифта.

Вот моя проблема, у меня нет контроля над тем, какие символы использует пользователь, поэтому мне нужно охватить все возможности в регулярном выражении /[0-9]{2}[°º]/, или даже лучше, убедиться, что текст содержит только те символы, которые я ожидая °. Но я не могу просто удалить неизвестные символы, иначе регулярное выражение не сработает, мне нужно изменить его на символы, которые выглядят так, и я ожидаю. Я сделал это с помощью небольшой функции, которая отображает «похоже» на «то, что я ожидаю» и изменяю его, проблема в том, что я не охватил все возможности, например, сегодня я нашел новый «-», теперь мы есть три из них, как у латекса = D - -- ---, круто, но регулярное выражение не сработало.

Кто-нибудь знает, как я мог бы решить эту проблему?

Ответы [ 5 ]

2 голосов
/ 24 марта 2010

К сожалению, не в PHP. ASP.NET имеет классы символов Unicode, которые охватывают подобные вещи, но, как вы можете видеть здесь ,: слишком много. Кроме того, поскольку это не PHP, в любом случае не помогает. :)

В PHP вы будете ограничены выбором наиболее распространенных наборов символов и их использованием.

Это должно помочь: http://unicode.org/charts/charindex.html

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

2 голосов
/ 24 марта 2010

Невозможно включить символы с «похожим внешним видом» в регулярное выражение, поэтому в принципе вы не можете.

Для конкретного персонажа вам может повезти со спецификацией Unicode, которая может перечислить некоторые из наиболее распространенных ошибок, но у вас нет гарантии. В случае знака градуса в кодовой таблице Unicode перечислены четыре одинаковых символа (\ u02da, \ u030a, \ u2070 и \ u2218), но не ваш проблемный символ, мужской порядковый индикатор.

1 голос
/ 25 марта 2010

Ваше регулярное выражение действительно должно будет перечислить все символы, которые вы хотите принять. Если вы не можете знать кодировку строки заранее, вы можете указать регулярное выражение UTF-8 с помощью модификатора / u в PHP: "/[0-9]{2}[°º]/u" Затем вы можете включить все символы Unicode, которые хотите принять в свой класс символов , Вам также необходимо преобразовать строку темы в UTF-8, прежде чем использовать регулярное выражение.

0 голосов
/ 20 июня 2014
0 голосов
/ 26 марта 2010

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

температура может составлять от 1 до 3 цифр, поэтому [0-9]{1,3} (и если кто-то еще жив, чтобы ввести четырехзначную температуру, мы все обречены!), Может быть более точным для вас.

Теперь знаки степени - сложная часть, как вы узнали. Если вы не можете контролировать пользователя (больше жаль), можете ли вы просто вытянуть то, что будет дальше?

[0-9]{1,3}.

Возможно, вам придется усилить первую часть, хотя с небольшой обработкой позиции, такой как начало строки или конец.

Вы также можете исключить все обычные символы, которые вам не нужны.

[0-9]{1,3}[^a-zA-Z]

Это поднимет все знаки препинания (хотя только один).

...