我有这个字符串,
马鹿:一种大型有蹄哺乳动物(马鹿属),有短毛长鬃毛和长尾,自古以来就被驯化并使用用于骑行和牵引或承载负载。
需要转换为
一种大型有蹄哺乳动物(马),有短毛、长鬃毛和长尾,自古以来就被驯养,用于骑马、牵引或搬运重物
以下是要求:
- 长度为5+的单词必须封装在a href标记中(这个问题已经解决)
- 括号内的单词必须被忽略这是正则表达式中缺少的要求
目前,下面的代码正在将原始字符串转换为以下字符串(括号内的数据不会被忽略):
一种大型有蹄哺乳动物(马),有短毛、长鬃毛和长尾,自古以来就被驯养,用于骑马、牵引或搬运重物
这是我当前的代码:
$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);