2016-08-12 5 views
1

Мне нужно отфильтровать строку, чтобы возвращать только «цифры, буквы и буквы с акцентами», используя PHP.Regex with only: цифры, буквы и акценты

Я пробовал много разных регулярных выражений, и я не мог.

Ближайший я получил:

$string = 'Você está bem? 123 # ! @ ...'; 
echo preg_replace('/[^\w\s+$]/', '_', $string); 

// Return: Voc__ est__ bem_ 123 _ _ _ ___ 
// But I need to return: Você_está_bem_123 _ _ _ ___ 

Может кто-нибудь мне помочь? Я пытался решить это часами, даже ища другие вопросы.

ответ

7

Добавьте модификатор /u:

$string = 'Você está bem? 123 # ! @ ...'; 
echo preg_replace('/[^\w\s+$]/u', '_', $string); 
          ^

См this IDEONE demo

Подробнее о модификаторе /u в SO регулярное выражение документации:

Pattern и предметные строки рассматриваются как UTF-8.

+2

Просто FYI: если ваш вход также содержит диакритические как отдельные символы (вам нужно добавить '\ р {M}' классу символов: '/ [^ \ ш \ р {М} \ s + $]/u' as '/ \ w/u' соответствует только' [\ p {L} \ p {N} _] ' –

+0

Это работа, спасибо! Но мне нужно использовать« utf8_decode »и поэтому не работать: https: //ideone.com/IagsYU –

+0

Вы должны запустить регулярное выражение в строке Unicode * перед тем, как передать его в 'utf8_decode'. –

Смежные вопросы