preg replace — разбирает предложение с php preg_replace_callback и игнорирует данные в скобках

У меня есть эта строка,

Крупное копытное млекопитающее (Equus caballus), имеющее короткошерстную шерсть,
длинная грива и длинный хвост, одомашненные с древних времен и используемые
для езды и для рисования или перевозки грузов.

который должен быть преобразован в это:

большой копытное млекопитающее (Equus Caballus) имеющий короткаяволосатый пальто, длинная грива и длинный хвост, прирученный поскольку древний раз и используется для верховая езда и для Рисование или же проведение грузы.

Это требования:

  1. слова длиной 5+ должны быть заключены в тег href. (это уже решено)
  2. слова в скобках следует игнорировать. Это недостающее требование в регулярном выражении

В настоящее время приведенный ниже код преобразует исходную строку в эту (данные внутри скобок не игнорируются, как должно быть):

большой копытное млекопитающее (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-е требование в том же регулярном выражении?
Спасибо!

1

Решение

Вы можете использовать группу захвата:

$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);
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]