У меня есть эта строка,
Крупное копытное млекопитающее (Equus caballus), имеющее короткошерстную шерсть,
длинная грива и длинный хвост, одомашненные с древних времен и используемые
для езды и для рисования или перевозки грузов.
который должен быть преобразован в это:
большой копытное млекопитающее (Equus Caballus) имеющий короткая—волосатый пальто, длинная грива и длинный хвост, прирученный поскольку древний раз и используется для верховая езда и для Рисование или же проведение грузы.
Это требования:
В настоящее время приведенный ниже код преобразует исходную строку в эту (данные внутри скобок не игнорируются, как должно быть):
большой копытное млекопитающее (Equus Caballus) имеющий короткая—волосатый пальто, длинная грива и длинный хвост, прирученный поскольку древний раз и используется для верховая езда и для Рисование или же проведение грузы.
Это мой текущий код:
$result = preg_replace_callback('/\b[\p{L}\p{M}]{5,}\b/u', create_function(
'$matches',
'return "<a href=\"http://words.com/".strtolower($matches[0])."\">$matches[0]</a>";'
), $data);
Как я могу реализовать 2-е требование в том же регулярном выражении?
Спасибо!
Вы можете использовать группу захвата:
$result = preg_replace_callback('~(\([^)]+\))|[\pL\pM]{5,}~u', function ($m) {
if (empty($m[1]))
return '<a href="http://words.com/' . strtolower($m[0]) . '">' . $m[0] . '</a>';
return $m[1];
}, $data);
или вы можете использовать возврат глаголов управления (*SKIP)(*FAIL)
:
$result = preg_replace_callback('~\([^)]+\)(*SKIP)(*FAIL)|[\pL\pM]{5,}~u', function ($m) {
return '<a href="http://words.com/' . strtolower($m[0]) . '">' . $m[0] . '</a>';
}, $data);
Других решений пока нет …