用正则表达式为锚文本添加制表符


Add tab to anchor text with regex

我有这样的东西;

<a href="#" class="example">
Link 1
</a>
<a href="#" class="example">
Link 2
</a>
<a href="#" class="example">
Link 3
</a>

我想在锚文本之前添加标签。像这样的;

<a href="#" class="example">
  Link 1
</a>
<a href="#" class="example">
  Link 2
</a>
<a href="#" class="example">
  Link 3
</a>

我如何用正则表达式做到这一点?

编辑问题扩展名

从他的评论来看,现在看来OP的目标是更一般的用途,添加't s来缩进开始和结束标记之间的所有行。
然后是时候记住,正则表达式不是解析HTML的好方法,正如这里经常看到的那样。

但在这个不太广泛的背景下,我们可以提出一个解决方案。
除非有人找到更好的解决方案,否则我看不到没有两个嵌套步骤的方法:

$updated_text = preg_replace_callback(
    '/(<a[^>]*>)'s*(.*?)'s*(<'/a>)/s',
    function($matches) {
        return $matches[1]
          . "'n" . preg_replace('/([^'n]+)/', "'t$1", $matches[2])
          . "'n" . $matches[3];
    },
    $text
);

请注意,这不仅是一种糟糕的方法,而且由于.*?(不贪婪)量词,它非常耗时。


初始回答

感谢@bobblebubble的建议,我才明白什么意思"我想添加标签"(我以前认为只有浏览器的标签:).

但是我发现它的解决方案有点太一般了:它会给任何行添加制表符,这不是一个标签!
我更愿意密切关注<a>标签,只有在OP的示例中出现时:

$updated_text = preg_replace('/(<a[^>]*>)'s*([^<]*)'s*<'/a>/', '$1'n't$2</a>', $text);

是这样的:https://regex101.com/r/qo2N22/1.