解析字符串中的hashtag(锚标记除外)

Parse hashtags in a string, except for anchor tags

本文关键字:字符串 hashtag      更新时间:2023-09-26

我想将给定字符串中的标签(#)的任何实例转换为HTML标签:

例如:

  • #test应转化为<a>#test</a>
  • test#test不应转换
  • <a href="#test">#test</a>不应该转换
  • <p>#test</p>变为<p><a>#test</a></p>
  • <b>#test</b>变为<b><a>#test</a></b>

可以这样开始(在vim中测试):

:% subst :<[^>|a>]'+>'zs'(#[^<]'+')'ze:<a>'1</a>:

它会满足你最后三个要求。

至于前两个,我想它们太宽泛了,特别是因为test#test。我现在在工作,不能在这上面花太多时间。

顺便说一下,正如人们所说,regexp不应该用来解析html/xml的东西。不过,如果是学习和研究,也许还是可以的。

编辑:这个正则表达式匹配前两个要求:

%s:'('w'|<[^>]'+>'|"')'@<!'(#[^ ]'+'):<a>'2<'/a>:

它将在#hashtag周围添加<a>直到第一个空白。这需要根据你的情况进行调整。当#hashtag没有出现在html标签,单词字符(teste#teste不匹配)或双引号(属性)之后时,它将匹配#hashtag。你也可以添加单引号或其他可能性。

这是一个很好的练习(在午餐时间…),但一定要遵循人们在评论中给你的建议。

正则表达式需要

(<['w]+>#test<'/['w]+>)|^(#test)|('s#test)|('s#test$)

演示

var str = '#test test#test #test har #test <a href="#test">#test</a> <p>#test</p> <b>#test</b> <pre>#test</pre> #test char #test'
//str.match(/(<['w]+>#test<'/['w]+>)|^(#test)|('s#test)|('s#test$)/g)
//["#test", " #test", " #test", "<p>#test</p>", "<b>#test</b>", "<pre>#test</pre>", " #test", " #test"]
str.replace(/(<['w]+>#test<'/['w]+>)|^(#test)|('s#test)|('s#test$)/g, function($1) {
return $1.replace('#test','<a>#test</a>')
})

<a>#test</a> test#test <a>#test</a> har <a>#test</a> <a href="#test">#test</a> <p><a>#test</a></p> <b><a>#test</a></b> <pre><a>#test</a></pre> <a>#test</a> char <a>#test</a>

尽管有关于使用正则表达式解析html的所有免责声明,但有一个简单的方法可以做到这一点。

这个问题是本问题中解释的"regex匹配模式,不包括…"技术的经典案例。

我们可以用一个非常简单的正则表达式来解决它:

'w#test|<a.*?</a>|(#test)

在不需要的上下文中,|的所有左侧都匹配完整的#test。我们将忽略这些匹配。右边匹配并捕获#test到组1,我们知道它们是正确的,因为它们没有被左边的表达式匹配。

这个程序展示了如何使用正则表达式。请注意,我将演示中的替换为[a]而不是<a>,因此结果在浏览器中可见。查看在线演示的右窗格中的结果):

var subject = ' yesSingle #test  no test#test no <a href="#test">#test</a> yesParagraph <p>#test</p> yesBold <b>#test</b>';
var regex = /'w#test|<a.*?<'/a>|(#test)/g;
replaced = subject.replace(regex, function(m, group1) {
    if (group1 == "" ) return m;
    else return "[a]" + group1 + "[/a]";
});
document.write(replaced);
参考

  • 如何匹配(或替换)模式,除了s1, s2, s3…
  • 关于匹配模式的文章,除非…