我知道解析器最适合这种情况,但在我目前的情况下,它必须只是简单的javascript。
我有一个正则表达式来查找html doc的结束体标记。
var closing_body_tag = /(<\/body>)/i;
但是,当源设置了多个body标签时,这会失败。所以我在想这样的事情......
var last_closing_body_tag = /(<\/body>)$/gmi;
这适用于找到多个标签的情况,但由于某种原因,仅使用一组标签的情况就失败了。
我是否犯了一个会导致单个标签案件混合结果的错误?
是的,我理解多个身体标签不正确,但是,我们必须处理所有不良来源。
答案 0 :(得分:1)
您可以使用此正则表达式:
/<\/body>(?![\s\S]*<\/body>[\s\S]*$)/i
(?![\s\S]*<\/body>[\s\S]*$)
是一个前瞻,可以确保在字符串结尾之前没有更多关闭正文标记。
这是demo。
添加标签的示例代码:
var re = /<\/body>(?![\s\S]*<\/body>[\s\S]*$)/i;
var str = '<html>\n<body>\n</body>\n</html>\n<html>\n<body>\n</body>\n</html>';
var subst = '<tag/>';
var result = str.replace(re, subst);
答案 1 :(得分:1)
正如我在评论中所建议的那样,使用:
/^[\S\s]+(<\/body>)/i
这将获得所有文本(贪婪),直到文本</body>
标志i
表示不区分大小写。无论您拥有多少身体标签,这都可以使用
</body>
</BODY>
</BoDY>
</body><!--This one's selected-->
你说你使用的JavaScript可以用作:
yourString.match(/^[\S\s]+(<\/body>)/i)[1];
当您没有.match
标志时, g
可以正常工作。进一步解释这个RegExp
^
在整个字符串的开头匹配它,因为我们没有m
标记
[\S\s]+
将匹配所有内容,直到以下内容为止。+
可以替换为*
(<\/body>)
会在前一个(最后一个)之后获取正文标记并将其添加为匹配
i
i
标志使字符串不区分大小写(如果您希望区分大小写,则删除)
如果你有多个body标签,你仍然可以在它之前添加一个元素。
var elem = document.createElement('div');
elem.setAttribute('id', 'mydiv');
elem.innerHTML = 'Foo';
现在,elem
可以通过多种方式添加:
window.document.body.appenedChild(elem);
var body_elems = document.getElementsByTagName('body');
body_elems[body_elems.length - 1].appendChild(elem);
答案 2 :(得分:0)
使用
/(.|[\r\n])*(<\/body>)/mi
作为正则表达式。 Capture组是2美元。
这利用了与多线选项相关的贪婪匹配。请注意,'any char'符号与newlines /回车符不匹配,因此需要显式引用。
答案 3 :(得分:0)
匹配最后一个body标签的正则表达式非常简单:
/[\s\S]*(</body>)/i
这样做可以在</body>
之前匹配尽可能多的任何字符(更具体地说,任何空白空间或任何不是空白的空格)。
i
标志表示它会匹配</body>
的任何情况,所以类似:
</body>
</BODY>
</BodY>
一切都会匹配。
我使用[\s\S]
代替.
,因为.
匹配所有但换行符运算符,这可能不是您想要的。 \s
匹配所有空格 - 空格,制表符,各种换行符 - \S
等同于[^\s]
,因此它匹配所有非空格的内容。它们一起匹配每个可能的角色。我认为\w\W
,\d\D
等可能会发生类似的事情,但\s\S
是我的偏好。