用php preg_replace_callback分析句子,忽略括号内的数据


Parse sentence with php preg_replace_callback and ignore data inside parenthesis

我有这个字符串,

马鹿:一种大型有蹄哺乳动物(马鹿属),有短毛长鬃毛和长尾,自古以来就被驯化并使用用于骑行和牵引或承载负载。

需要转换为

一种大型有蹄哺乳动物(马),有短毛、长鬃毛和长尾,自古以来就被驯养,用于骑马、牵引或搬运重物

以下是要求:

  1. 长度为5+的单词必须封装在a href标记中(这个问题已经解决)
  2. 括号内的单词必须被忽略这是正则表达式中缺少的要求

目前,下面的代码正在将原始字符串转换为以下字符串(括号内的数据不会被忽略):

一种大型有蹄哺乳动物(马),有短毛、长鬃毛和长尾,自古以来就被驯养,用于骑马、牵引或搬运重物

这是我当前的代码:

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

如何在同一正则表达式中实现第二个要求?谢谢

您可以使用一个捕获组:

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