Preg_match с использованием регулярных выражений теряют последний символ - PullRequest
0 голосов
/ 24 января 2012

У меня есть файл (.txt), который я хотел бы отформатировать. линии выглядят так =>

Name on Company
Street 7 CITY phone: 1234 - 56 78 91 Webpage: www.webpage.se
http://www.webpage.se

Name on Restaurant
Street 11 CITY CITY phone: 7023 - 51 83 83 Webpage:
http://

Проблема, с которой я столкнулся, связана с моим регулярным выражением, когда я хотел бы соответствовать городу (который указан в верхнем регистре). Пока я приду к этому =>

preg_match('/\b[A-ZÅÄÖ]{2,}[ \t][A-ZÅÄÖ]+|[A-ZÅÄÖ]{2,}\b/', $info, $city);

Как вы видите, это шведский город, с которым я работаю, таким образом, A-ZÅÄÖ. Но использование этого регулярного выражения не работает, если последним символом в названии города является либо «ÅÄÖ», в этих случаях перед этим просто используются символы.

кто-нибудь видит проблему?

заранее спасибо

Ответы [ 2 ]

1 голос
/ 24 января 2012

Ваша проблема в том, что \b определяется как соответствие границы между символами, которые находятся в \w, и теми, которые не являются.

Ваши шведские символы не находятся в \w (чтокак правило, эквивалентно [a-zA-Z0-9_]).

Вместо этого вы можете заменить \b соответствующими проверочными утверждениями ( пример ).

1 голос
/ 24 января 2012

FWIW, это может показаться идеальным местом для использования http://txt2re.com для разработки и проверки вашего регулярного выражения на примерах.

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

Я подозреваю, что проблема с Unicode.Возможно, входные данные имеют конечный Ä, который сохраняется как A, за которым следует отдельный символ , объединяющий диарез .Решением для этого является нормализация строки Unicode до применения регулярного выражения.

Кроме того, как указывает Эмбер, проблема может заключаться в определении \b границы слова. документы скажем, A "word" character is any letter or digit or the underscore character, that is, any character which can be part of a Perl "word". The definition of letters and digits is controlled by PCRE's character tables, and may vary if locale-specific matching is taking place. For example, in the "fr" (French) locale, some character codes greater than 128 are used for accented letters, and these are matched by \w. Итак, вы можете получить облегчение, изменив настройку локали.

В качестве альтернативы, вы можете попробовать установить u модификатор рисунка в случае, если вход находится в формате UTF-8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...