解析字符串中的主题标签,锚标签除外

时间:2014-06-20 13:45:31

标签: javascript jquery regex hashtag

我想将给定字符串中的主题标签(#)的任何实例转换为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>

3 个答案:

答案 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$)

Demo

<强>代码

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);

参考