Javascript 帮助编写用<;围绕特定文本的正则表达式;strong>;标签,仅当<;strong>;标签是';不在场
我在一个网站上有几篇帖子;所有这些帖子都是此类聊天对话: 广告:嘿Javascript 帮助编写用<;围绕特定文本的正则表达式;strong>;标签,仅当<;strong>;标签是';不在场,javascript,html,regex,Javascript,Html,Regex,我在一个网站上有几篇帖子;所有这些帖子都是此类聊天对话: 广告:嘿 不列颠哥伦比亚省:怎么了? 广告:没什么 BC:好的 它们被标记为由标记包围的简单段落 使用javascript replace函数,我希望会话开始时的所有“AD”实例(即,一行开头的所有“AD”实例后跟“:”)被标记包围,但前提是该实例尚未被标记包围 我应该使用什么正则表达式来实现这一点?我是不是在试图做我不喜欢的事 我使用的代码如下所示: var posts = document.getElementsByClassName
不列颠哥伦比亚省:怎么了?
广告:没什么
BC:好的 它们被标记为由
标记包围的简单段落
使用javascript replace函数,我希望会话开始时的所有“AD”实例(即,一行开头的所有“AD”实例后跟“:”)被
标记包围,但前提是该实例尚未被标记包围
我应该使用什么正则表达式来实现这一点?我是不是在试图做我不喜欢的事
我使用的代码如下所示:
var posts = document.getElementsByClassName('entry-content');
for (var i = 0; i < posts.length; i++) {
posts[i].innerHTML = posts[i].innerHTML.replace(/some regex here/,
'replaced content here');
}
var posts=document.getElementsByClassName('entry-content');
对于(变量i=0;i
将查找到的段落的class或style属性设置为text-weight:bold或大致相同的类不是更容易吗?这样,您就不必担心添加标记或搜索现有标记。如果您不必进行任何字符串替换,也可能执行得更好
如果您真的想添加强标记,我建议使用DOM函数查找段落中的子节点,如果找不到,则添加它并将段落的原始(文本)子节点移动到其中。如果AD:
始终位于行的开头,则以下正则表达式应该可以工作,使用m
开关:
.replace(/^AD:/gm, "<strong>AD:</strong>");
在innerHTML
上使用正则表达式是不可靠的,可能会导致问题。正确的方法是一个令人厌烦的过程,但要可靠得多
例如
我无法在整个段落中添加类/样式,因为只有行[“AD”]的前两个字符必须为黑体。你的第二个建议似乎很好,虽然有点复杂。谢谢这里的问题是,虽然AD总是在输出中的行的开头,但在代码中它很可能是这样的:AD:Hey
BC:Hi
AD:ok
,都在一行上。这种情况如何?我去看看。它们是跨浏览器兼容的吗?@sahil:惊奇,惊奇,低于8的IE版本不支持与其他浏览器相同的范围。检查我的更新答案,看看是否有一个正则表达式对你有用。哇,这是非常彻底的。你认为这是绝对必要的吗?如果我在innerHTML上使用正则表达式,我会遇到什么样的问题?[顺便说一句,第一行的变量应该是lh
或者条件应该是i
,对吗?]根据您的情况,innerHTML解决方案可能是可以的。这种方法是一种全面的更好的方法,因为它不会在很多情况下中断。例如,读取并替换innerHTML将删除绑定到正在更改的元素中的元素/节点的所有状态/数据/事件处理程序。这对你来说可能不是问题,但通常是必须考虑的。
.replace(/<(p|br)>AD:/gm, "<$1><strong>AD:</strong>");
for (var i = 0, l = posts.length; i < l; i++) {
findAndReplaceInDOM(posts[i], /^AD:/g, function(match, node){
// Make sure current node does note have a <strong> as a parent
if (node.parentNode.nodeName.toLowerCase() === 'strong') {
return false;
}
// Create and return new <strong>
var s = document.createElement('strong');
s.appendChild(document.createTextNode(match[0]));
return s;
});
}
function findAndReplaceInDOM(node, regex, replaceFn) {
// Note: regex MUST have global flag
if (!regex || !regex.global || typeof replaceFn !== 'function') {
return;
}
var start, end, match, parent, leftNode,
rightNode, replacementNode, text,
d = document;
// Loop through all childNodes of "node"
if (node = node && node.firstChild) do {
if (node.nodeType === 1) {
// Regular element, recurse:
findAndReplaceInDOM(node, regex, replaceFn);
} else if (node.nodeType === 3) {
// Text node, introspect
parent = node.parentNode;
text = node.data;
regex.lastIndex = 0;
while (match = regex.exec(text)) {
replacementNode = replaceFn(match, node);
if (!replacementNode) {
continue;
}
end = regex.lastIndex;
start = end - match[0].length;
// Effectively split node up into three parts:
// leftSideOfReplacement + REPLACEMENT + rightSideOfReplacement
leftNode = d.createTextNode( text.substring(0, start) );
rightNode = d.createTextNode( text.substring(end) );
parent.insertBefore(leftNode, node);
parent.insertBefore(replacementNode, node);
parent.insertBefore(rightNode, node);
// Remove original node from document
parent.removeChild(node);
}
}
} while (node = node.nextSibling);
}