我如何修改我的mentionify扩展以忽略已经'mentionify'-ed元素
How can I modify my mentionify extension to ignore already 'mentionify'-ed elements?
我已经编写了一个jQuery扩展:
$.fn.mentionify = function() {
return this.each(function() {
var link = $(this);
link.html(link.html().replace(/(^|[^@'w])@('w{1,30})'b/g, '$1<span class="mention">@$2</span>'));
});
}
哪个转向:
@username
但不是:
name@website.com
进入:
<span class="mention">@username</span>
但是,如果我在一个元素上运行它两次,它就会将已经存在的span
封装在另一个span
标记中。如何检查预先存在的span
?
让它测试Regex,看看是否已经存在跨度。
function() {
var link = $(this);
if(/<span/.test(link.html()))
return;
link.html(link.html().replace(/(^|[^@'w])@('w{1,30})'b/g, '$1<span class="mention">@$2</span>'));
}
编辑:
好吧,我终于明白你在问什么,你想做什么了。然而,我在尝试中没有找到答案。但我不想让你两手空空,所以我告诉你我经历了什么。希望这将在某种程度上有所帮助。
尝试1
首先,您需要更改正则表达式,这是正确的。但这不是用一个表达式就能实现的。最初,我的想法是检查结束标签。这将从<span>@test</span>@test2
匹配@test
。
但这并不能解释两个跨度之间的@:<span></span>@test<span></span>
。请在此处查看最后一行https://regex101.com/r/zB3yI9/5.
为了应对这种情况,您需要在之前检查打开标签。但它是一个嵌套的跨度。。。。这也是同样的问题。
尝试2
我现在知道Regex模式本身还不够复杂。相反,您需要递归遍历DOM,直到找到一个简单可行的字符串。
我在jQuery中写了一个小提琴来做这件事。http://jsfiddle.net/zf63hca2/
但我遇到了一个问题。jQuery只看到DOM对象,而不看到它们周围的零散文本。
尝试3
所以DOM不能帮你,它必须用Regex来完成。艰难的道路。我现在知道他们为什么警告我不要使用RegexHTML了。我会写代码,但我的大脑快要融化了。因此,以下是步骤的详细信息。
- 递归查找所有简单表达式,将它们从字符串中删除。一个简单的表达式是一个打开和关闭跨度之间没有一个打开
- 不断重复1,直到不再匹配为止。这将说明嵌套
- 最后应该只剩下一堆没有span标记的字符串
- 匹配Twitter帐户并替换
- 倒过来把整件事拼凑起来
有一个Regex API可以简化这个过程。XRegExp支持链接。优点是你还可以从每场比赛中获得开始和结束索引。
TL;DR
如果你真的想让它与DOM一起工作,那么无论如何,去做吧。但到目前为止,只要提供的字符串不包含DOM,它就已经可以构建多个Twitter链接了。
- CKEditor Widget-阻止编辑可编辑元素本身
- 如何设置html元素填充的动画
- 如何将HTML id分配给元素,以及如何将JavaScript应用于元素
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 使用clickToggle并在单击另一个元素时关闭元素
- 单击时将焦点更改为元素
- 表追加而不附加最后一个元素
- 如何在jQuery中获取元素的形式
- 我可以获得相对于被点击元素的确切点击位置吗
- 在函数中添加数组元素的数值
- 在单击任何位置时隐藏元素,而不检查每次DOM单击
- 将视口底部滚动到元素底部
- 是否有任何snippet或jQuery插件可以列出easylist.txt模式匹配的DOM中的所有元素
- 在不使用JQuery的情况下隐藏DOM中的选定元素
- 如何使用jquery处理php循环通过元素
- Ckeditor-plugin:插入虚假元素add不情愿<p>标签前后
- JQuery添加元素需要在我的js之前再次添加JQuery脚本
- 在Jquery detachment()和appendTo()之后定位元素
- 在动态创建的元素上获取对特定选择器的引用
- 我如何修改我的mentionify扩展以忽略已经'mentionify'-ed元素