2014-09-17 4 views
2

У меня есть функция, которая находит и извлекает «полоски» из 3 слов из более длинной строки в массив. Значения пунктуации рядом со словами должны быть включены в слово (например, слово, за которым следует запятая, должно рассматриваться как одно слово).Ошибка PHP Regex в правой двойной кавычки

Он отлично работает за исключением на одном символе UTF-8 - знак двойного правого предложения (U + 201D - ").

Я делаю что-то не так в своем регулярном выражении или это ошибка PHP?

регулярного выражения:

$myarray = preg_match_all(
    "/(\S)*(\s)(\S)*(\s)(\S)*(\s)/", 
    $incomingstring, 
    $output, 
    PREG_PATTERN_ORDER); 

странно регулярное выражение не имеет никаких проблем с двойными следами котировальных (U + 201C - «) или некоторыми другими символами Юникода я пробовал.

+2

Я думаю, вы должны использовать 'u' модификатор – hindmost

+0

Спасибо! Да, модификатор u исправил проблему. –

ответ

2

При обработке как однобайтовые символы & # x201d; рассматривается как 0xE2, 0x80, 0x9D

Аналогичным образом, & # x201c; становится 0xE2, 0x80, 0x9C

Разница между последним байтом. В одном случае вы получаете 0x9C, а другой 0x9D. В кодировке Windows-1252 (которая является общепринятой по умолчанию, часто неправильно помеченной как ISO-8859-1), 0x9C - œ, но 0x9D не определен. Это приводит к непредсказуемому поведению относительно \S и \s, в результате чего ваше регулярное выражение прерывается.

Решение, как указано в последнем примечании, заключается в использовании модификатора u, чтобы сообщить вашему регулярному выражению работать в UTF-8 вместо одиночных байтов.

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