2014-09-22 3 views
0

У меня есть preg_match_all для поиска слов в абзаце. Он не находит символы кириллицы и т.д. Как я могу изменить это, чтобы сделать все типы характеров (английский, кириллица, акцентированные символы и т.д.):preg_match_all: Включить символы, отличные от ASCII

preg_match_all('/\b' . $testWord .'\b/i', $content, $matches, PREG_OFFSET_CAPTURE); 

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

preg_match_all('/\b' . $testWord .'\b/iu', $content, $matches, PREG_OFFSET_CAPTURE); 

Спасибо

+2

Вы приближаетесь к этому неправильно, я верю ... Я бы сказал, замените ваш testWord на '\ p {L} +', который соответствует любому типу письма с любого языка. – hwnd

ответ

2

К сожалению, даже с модификатором u слова границы сокращенной \b может барахлить (т.е. не совпадает, где вы ожидаете.) Вы хотите, чтобы заменить их с отрицательным lookarounds для проверки \pL (любая буква) или \pM

Подобно (любое сочетание диакритических знаков.):

preg_match_all(
    '/(?<![\pL\pM])' . $testWord .'(?![\pL\pM])/iu', 
    $content, 
    $matches, 
    PREG_OFFSET_CAPTURE 
); 
+0

Спасибо, что сработало хорошо для меня. Я тестировал с русским, французским ивритом и китайскими словами. – mbird

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