Javascript正则表达式在字符串末尾找到开始标记

时间:2015-10-27 12:34:05

标签: javascript html regex string

我正在寻找一个Javascript正则表达式来查找字符串的结束开始标记。我想找到所有开始标记(中间没有其他常规文本),只跟其他开放标记或者直到最后没有字符串。

示例字符串:<b>sds</b>This is a<u> test.<br><b><span class="test">;

期望的结果<b><span class="test">

编辑:澄清一下:我必须处理包含部分html内容的字符串。它本身并不是有效的html。因此我无法在dom节点上运行。由于我处于一个非常特殊的环境中,我没有嵌套标签也没有无效标签 - 只是常规内联标签(甚至只有u,b,i,span,sup,sup,img,br)。

我对不包括正则表达式的解决方案持开放态度,但我无法在此处使用dom节点。

2 个答案:

答案 0 :(得分:1)

这不仅仅是你应该 - 你不能。正则表达式可以捕获组并在字符串中稍后再次查找它们,因此理论上您可以找到匹配的HTML标记。找出哪些没有匹配 - 或试图在不符合的HTML代码中找到标签对 - 似乎相当复杂。您还需要忽略所有属性和属性名称。这很快就会失控。

但是当Regex显然无法为你解决这个问题时,你可能会有多个相同的标签,以及你可能有无效的交叉标签,例如<b><i>Sample text</b></i>。我不认为有可能解决每一个异常情况,但我认为可以说,如果可以在一个正则表达式中进行,那么运行并永远写入会花费很多时间。

另外,如果你需要检测没有结尾/>的自动关闭元素,那么考虑到偶尔将新元素添加到HTML并且你的代码无法处理,这会使事情变得更糟糕和他们一起。

如果你想修复一些东西,最好的办法是使用DOM操作。或者首先创建好的HTML。

编辑:即使是格式良好的文档也无法使用,因为当一行中存在多个相同标记的实例时,无法找到哪个标记匹配。示例:http://regexr.com/3c2mb

答案 1 :(得分:0)

您正在寻找的模式是:

(?:<(?!(?:[hb]r|img|link|other_self_closing_tags)\b)\w+\b[^">]*(?:"[^"]*"[^">]*)*>)+$

细节:

(?:
    <                # start of the tag
    (?!  # lookahead assertion (not followed by)
        (?:[hb]r|img|link|other_self_closing_tags)
        \b # word boundary
    )
    \w+ \b # tag name
    [^">]* # all that is not a " or a >
    (?:"[^"]*"[^">]*)* # quoted substrings (to deal with attributes)
    >
)+
$   # end of the string