【问题标题】:preg_replace replace group #1preg_replace 替换组 #1
【发布时间】:2021-12-20 11:54:56
【问题描述】:

假设以下字符串:

@twitter @handles @hello

使用下面的代码,我可以替换字符串并生成链接

preg_replace(
    '/(?:^|[^>])(@' . $data->entities->user_mentions[$i]->screen_name . ')/',
    '<a href="https://twitter.com/' . $data->entities->user_mentions[$i]->screen_name . '">@' . $data->entities->user_mentions[$i]->screen_name . '</a>',
    $data->text
);

但上面的代码替换了第 0 组,而不是第 1 组。

Stack Overflow 上的很多问题都显示了如何将组 0 替换为组 1,但不是相反。

我的代码不是很清楚,所以让我来说明问题:

第 1 组如下所示:

@twitter
@handles
@hello

但是第 0 组看起来像这样:

@twitter
 @handles
 @hello

它匹配空格,我不想要那个。

【问题讨论】:

  • 不完全清楚 PHP 值是什么,但你能重置偏移量吗? /(?:^|[^&gt;])\K@' . $data-&gt;entities-&gt;user_mentions[$i]-&gt;screen_name . '/ 我认为这会让 0 成为你想要的。
  • @user3783243 我编辑了我的问题
  • 在这种情况下你可以只附加可选的空格吗? \h*群前
  • @user3783243 可以。但后来我需要trim() 输出。我真的很想知道你是否可以替换第 1 组。

标签: php regex pcre


【解决方案1】:

您可以将(?:^|[^&gt;]) 更改为不会消耗的负向后视(?&lt;!&gt;)

另一个选项是use \K to reset 报告匹配的开头:(?:^|[^&gt;])\K

仅供参考:据我所知,除了使用 preg-replace-callback(您可以修改/返回任何组的捕获)之外,\K 是更改完整报告部分的唯一选项 [0]从正则表达式方面。

【讨论】:

    【解决方案2】:

    如果您希望左侧的空白边界与 #@twitter 不匹配,您也可以省略捕获组并使用否定的后向断言 (?&lt;!\S)

    preg_replace(
        '/(?<!\S)@' . $data->entities->user_mentions[$i]->screen_name . '/',
        '<a href="https://twitter.com/' . $data->entities->user_mentions[$i]->screen_name . '">@' . $data->entities->user_mentions[$i]->screen_name . '</a>',
        $data->text
    );
    

    【讨论】:

      猜你喜欢
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      • 2011-01-24
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      相关资源
      最近更新 更多