我想将给定字符串中的主题标签(#
)的任何实例转换为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>
答案 0 :(得分:0)
以下内容可能是一个开始(在vim中测试):
:% subst :<[^>|a>]\+>\zs\(#[^<]\+\)\ze:<a>\1</a>:
它符合你的最后三个要求。
至于前两个,我猜,它们太宽泛,特别是因为test#test
。我在工作,现在不能花很多时间在这上面。
顺便说一下,正如人们所说,regexp不应该用来解析html / xml的东西。但是,如果要学习和学习,也许还可以。
编辑:这个其他正则表达式符合前两个要求:
%s:\(\w\|<[^>]\+>\|"\)\@<!\(#[^ ]\+\):<a>\2<\/a>:
它会在#hashtag周围添加<a>
到第一个空白区域。这将根据您的情况需要进行调整。当它们没有出现在html标签,单词字符(teste#teste不会匹配)或双引号(属性)之后,它匹配#hashtags。您可能还必须添加单引号或其他可能性。
这是一个很好的运动(在午餐时间......),但要遵循人们在评论中给你的建议。
答案 1 :(得分:0)
您需要的RegEx
(<[\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>
答案 2 :(得分:0)
关于使用正则表达式解析html的所有免责声明,有一种简单的方法可以做到这一点。
此问题是此问题中向"regex-match a pattern, excluding..."
解释的技术的典型案例我们可以通过一个非常简单的正则表达式解决它:
\w#test|<a.*?</a>|(#test)
交替|
的所有左侧在不需要的上下文中匹配完成#test
。我们将忽略这些匹配。右侧匹配并捕获#test
到组1,我们知道它们是正确的,因为它们与左侧的表达式不匹配。
该程序显示了如何使用正则表达式。请注意,演示文稿的已替换为[a]
而不是<a>
,因此结果在浏览器中可见。请参阅online demo)右侧窗格中的结果:
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);
参考