我有这样的东西;
<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.