正则表达式找到最后一个正文标记

时间:2015-04-24 15:06:29

标签: javascript regex

我知道解析器最适合这种情况,但在我目前的情况下,它必须只是简单的javascript。

我有一个正则表达式来查找html doc的结束体标记。

var closing_body_tag = /(<\/body>)/i;

但是,当源设置了多个body标签时,这会失败。所以我在想这样的事情......

var last_closing_body_tag = /(<\/body>)$/gmi;

这适用于找到多个标签的情况,但由于某种原因,仅使用一组标签的情况就失败了。

我是否犯了一个会导致单个标签案件混合结果的错误?

是的,我理解多个身体标签不正确,但是,我们必须处理所有不良来源。

4 个答案:

答案 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标志使字符串不区分大小写(如果您希望区分大小写,则删除)

JavaScript appendChild

如果你有多个body标签,你仍然可以在它之前添加一个元素。

var elem = document.createElement('div');
elem.setAttribute('id', 'mydiv');
elem.innerHTML = 'Foo';

现在,elem可以通过多种方式添加:

1

window.document.body.appenedChild(elem);

2

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是我的偏好。