2016-12-30 3 views
0

У меня есть следующий preg_match, но я не могу получить Ë из строки.PHP preg_match Ë не работает

$title = 'This is blablabla BRAZILIË'; 
preg_match_all('/\b([A-Z]+)\b/', $title, $matches); 

Выход:

Array 
(
    [0] => Array 
    (
     [0] => BRAZILI 
    ) 

Я хочу:

Array 
(
[0] => Array 
    (
     [0] => BRAZILIË 
    ) 

ответ

3

Использование юникода свойств для заглавной буквы \p{Lu} и не забывайте u модификатор:

$title = 'This is blablabla BRAZILIË'; 
preg_match_all('/\b(\p{Lu}+)\b/u', $title, $matches); 
print_r($matches); 

Согласно комментировать, это путь к нижнему регистру многобайтовый см mb_strtolower:

$title = 'This is blablabla BRAZILIË'; 
preg_match_all('/\b(\p{Lu}+)\b/u', $title, $matches); 
$res = ucfirst(mb_strtolower($matches[0][0])); 
echo "$res\n"; 

Выход:

Brazilië 
+0

Это работает, но после этого BRAZILIË должен быть Brazilië. Whit ucfirst Я получаю BraziliË – Bas

+0

@Bas: Используйте mb_strtolower, см. Мое редактирование – Toto

+0

Это сделало! Тинкс! – Bas

0

Вам нужно будет использовать соответствия Юникода. Попробуйте это:

preg_match_all("/\b([A-Z\x{c0}-\x{ff}]+)\b/u", $title, $matches); 

В зависимости от случаев использования вы можете расширить символы, глядя на эту таблицу: http://www.utf8-chartable.de/

+0

Thnx, это работает, только после этого strtolower и ucfirst возвращает BraziliË, как я могу исправить, что Brazilië? – Bas

+0

На самом деле, каковы слова, которые вы намерены сопоставить? –

+0

CAPITAL слова в «Капитальные слова», поэтому первая буква ucfirst() – Bas

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