2014-10-27 36 views
1

我有这样的字符串数据,解析句子用PHP preg_replace_callback并忽略内部括号

一个大的有蹄哺乳动物(马属caballus)自古以来,用于骑行和绘画或运载货物时使用 。

需要被转换成这样:

largehoofedmammal(马属caballus)having一个short - haired涂层,长鬃,和一个长尾巴,domesticatedsinceancienttimes和用于ridingdrawingcarryingloads

这些是要求:

  1. 词语与5+的长度必须被封装在一个href标记的内部。 (已解决)
  2. 括号内的词必须忽略。 这是在正则表达式的缺失要求

目前,下面的代码是原来的字符串转换成本(在括号内的数据没有被忽略,因为它应该是):

largehoofedmammalEquuscaballushaving一个short - haired涂层,长鬃,和一个长尾巴,domesticatedsinceancienttimes和用于ridingdrawingcarryingloads

这是我当前的代码:

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

我如何能实现在同一个正则表达式的第二个要求是什么? 谢谢!

回答

3

您可以使用捕获组:

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

,或者您可以使用backtracking control verbs(*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); 
+0

我使用的捕捉组版本。工作很好,谢谢! – andufo 2014-10-27 22:27:05