【问题标题】:Parse sentence with php preg_replace_callback and ignore data inside parenthesis使用 php preg_replace_callback 解析句子并忽略括号内的数据
【发布时间】:2014-12-23 05:22:53
【问题描述】:

我有这个字符串,

一种大型有蹄哺乳动物(Equus caballus),有短毛, 长鬃毛,长尾,自古驯化,用 用于骑行、牵引或搬运负载。

需要转换成这个:

一件largehoofedmammal(Equus caballus)having一件short-haired外套,长鬃毛和长尾巴,domesticatedsince@98765493 @times 并用于ridingdrawingcarrying loads

这些是要求:

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

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

一件largehoofedmammal(Equuscaballus)having一件short-haired外套,长鬃毛和长尾巴,domesticated@ 987654344@ ancient times 并用于ridingdrawingcarrying loads

这是我当前的代码:

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

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

【问题讨论】:

    标签: php preg-replace preg-replace-callback


    【解决方案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);
    

    或者你可以使用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);
    

    【讨论】:

    • 我使用的是捕获组版本。效果很好,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2011-05-31
    • 2020-02-21
    • 2019-04-13
    • 2019-08-06
    • 2021-03-27
    • 2015-09-10
    相关资源
    最近更新 更多