Шаблон регулярного выражения с использованием w. * Не совпадает с текстом, начинающимся с иностранных символов, таких как Ä - PullRequest
6 голосов
/ 15 ноября 2011

У меня есть следующее регулярное выражение, которое я успешно использовал:

preg_match_all('/(\d+)\n(\w.*)\n(\d{3}\.\d{3}\.\d{2})\n(\d.*)\n(\d.*)/', $text, $matches)

Однако я только что обнаружил, что если текст, который соответствует части (\w.*), начинается с иностранного символа, такого как Ä, тогда это ничего не соответствует.

Может кто-нибудь помочь мне с тем, какой должен быть правильный шаблон вместо (\w.*), чтобы соответствовать строке, начинающейся с любого символа?

Большое спасибо

Ответы [ 4 ]

9 голосов
/ 15 ноября 2011

Если вы делаете хотите сопоставить умлауты, то добавьте модификатор regex /u или используйте \pL вместо \w. Это позволит регулярному выражению сопоставлять буквы вне диапазона ASCII.

Ссылка: http://www.regular -expressions.info / unicode.html
и http://php.net/manual/en/regexp.reference.unicode.php

3 голосов
/ 15 ноября 2011

А - это немецкий умлаут, если я не ошибаюсь. \w Совпадения (в большинстве ароматов) [a-zA-Z0-9_].

Вам нужно будет соответствовать диапазон символов Unicode, который вы хотите.

\x{00C4} (php) соответствует желаемому символу. Возможно, вам потребуется создать класс символов для поддержки символов Юникода.

0 голосов
/ 15 ноября 2011

Рассмотрите возможность использования:

/(\d+)\n((\p{L}|\p{N}|_).*)\n(\d{3}\.\d{3}\.\d{2})\n(\d.*)\n(\d.*)/
0 голосов
/ 15 ноября 2011

вам, возможно, придется перейти на использование символов Юникода ...

как для ascii вы бы использовали [\ u0021- \ u007e] В этом случае ... возможно [\ u0021- \ u007e \ u0192- \ u687]

Я не совсем уверен, какой диапазон символов вам нужен, но \ w, я думаю, соответствует только вещам в нормальном диапазоне аски

...