Мне нужно извлечь различные типы терминов из строки.Я успешно извлекаю буквенно-цифровые символы, номера валют и различные числовые форматы с помощью этого регулярного выражения:
$numalpha = '(\d+[a-zA-Z]+)';
$digitsPattern = '(\$|€|£)?\d+(\.\d+)?';
$wordsPattern = '[\p{L}]+';
preg_match_all('/('.$numalpha. '|' .$digitsPattern.'|'.$wordsPattern.')/ui', $str, $matches);
Мне также нужно сопоставлять смайлики.Я скомпилировал следующее регулярное выражение:
#(^|\W)(\>\:\]|\:-\)|\:\)|\:o\)|\:\]|\:3|\:c\)|\:\>|\=\]|8\)|\=\)|\:\}|\:\^\)|\>\:D|\:-D|\:D|8-D|x-D|X-D|\=-D|\=D|\=-3|8-\)|\>\:\[|\:-\(|\:\(|\:-c|\:c|\:-\<|\:-\[|\:\[|\:\{|\>\.\>|\<\.\<|\>\.\<|\>;\]|;-\)|;\)|\*-\)|\*\)|;-\]|;\]|;D|;\^\)|\>\:P|\:-P|\:P|X-P|x-p|\:-p|\:p|\=p|\:-Þ|\:Þ|\:-b|\:b|\=p|\=P|\>\:o|\>\:O|\:-O|\:O|°o°|°O°|\:O|o_O|o\.O|8-0|\>\:\\|\>\:/|\:-/|\:-\.|\:\\|\=/|\=\\|\:S|\:'\(|;'\()($|\W)#
, которое, кажется, работает в определенной степени: код .
Кажется, что оно не работает для смайликов, расположенныхконец строки, хотя я указал
($|\W)
внутри регулярного выражения.
------------------ EDIT-----------------
Я удалил ($ | W), как предложил Тиддо, и теперь он соответствует смайликам в конце строки.Проблема в том, что регулярное выражение, содержащее (^ | \ W), также совпадает с символом, предшествующим смайлику.
Для тестовой строки:
$str = ":) Testing ,,:) ::) emotic:-)ons ,:( :D :O hsdhfkd :(";
Соответствуют следующим:
(
[0] => :)
[1] => ,:)
[2] => ::)
[3] => ,:(
[4] => :D
[5] => :O
[6] => :(
)
(',', '' и ':' также совпадают в терминах ':)' и ':(')
Фрагмент кода онлайн
Как это можно исправить?