Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 帮助编写用<;围绕特定文本的正则表达式;strong>;标签,仅当<;strong>;标签是';不在场_Javascript_Html_Regex - Fatal编程技术网

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

}