PHP | preg_match_all выдает по буквам
Есть регулярка:
/[\p{L}-—]+(?:\h[\p{L}-—]+)*(?=,)?/m
Проверена на сайте: https://regex101.com/r/ojQ1Hy/3
Проблема в том, что Laravel, а точнее php, выдает мне ответ по буквам, хотя на сайте выдает по словам. Что я делаю не так?
$re = '/[\p{L}-—]+(?:\h[\p{L}-—]+)*(?=,)?/m';
$str = 'гендерная интрига, драма, история, комедия, повседневность, приключения, психология, романтика, сёнэн-ай, яой';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
var_dump($matches);
Результат:
[0]=>
array(1) {
[0]=>
string(1) "�"
}
[1]=>
array(1) {
[0]=>
string(3) "е�"
}
[2]=>
array(1) {
[0]=>
string(1) "�"
}
[3]=>
array(1) {
[0]=>
string(5) "ер�"
}
[4]=>
array(1) {
[0]=>
string(1) "�"
}
...
Ответы (1 шт):
Автор решения: Sire IMPACTUS
→ Ссылка
Разобрался. Проблема была в регулярном выражении:
/[(pL-—)]+(?:\h[(pL-—)]+)*(?=,)?/m
Вместо:
/[a-zA-Zа-яА-ЯёЁ-—]+(?:\h[a-zA-Zа-яА-ЯёЁ-—]+)*(?=,)?/mu <- и добавить модификатор u, чтобы кодировка была многобайтовой