RegEx匹配XHTML自包含标签以外的打开标签

独自空忆成欢 提交于 2019-12-09 13:05:37
已锁定 。 该问题被 锁定,因为有许多离题的评论。 它目前不接受新的答案或互动。

我需要匹配所有这些开始标签:

<p>
<a href="foo">

但不是这些:

<br />
<hr class="foo" />

我想出了这个,想确保我做对了。 我只是捕获az

<([a-z]+) *[^/]*?>

我相信它说:

  • 找到一个小于,然后
  • 查找(并捕获)az一次或多次,然后
  • 找到零个或多个空格,然后
  • 找到零个或更多次的字符,贪婪的( /除外),然后
  • 寻找大于

我有那个权利吗? 更重要的是,您怎么看?


#1楼

<\s*(\w+)[^/>]*>

零件说明:

< :起始字符

\\s* :标记名称前可能有空格(难看,但可能)。

(\\w+) :标签可以包含字母和数字(h1)。 好吧, \\w也匹配“ _”,但是我猜并没有伤害。 如果好奇,请改用([a-zA-Z0-9] +)。

[^/>]*>/之前的任何内容,直到关闭>

> :关闭>

无关

对于那些低估正则表达式的人来说,它们仅与正则语言一样强大:

BA BAÑn的不规整,甚至不上下文无关,可以与匹配^(a+)b\\1b\\1$

反引用FTW


#2楼

中国古代的战略家,一般哲学家孙子说:

据说,如果您认识自己的敌人并认识自己,那么您就可以赢得一百场战斗,而不会遭受任何损失。 如果您只了解自己而不是对手,那么您可能会赢或输。 如果您既不认识自己,也不认识敌人,那么您将永远危害自己。

在这种情况下,您的敌人是HTML,而您本人或正则表达式。 您甚至可能是使用不规则正则表达式的Perl。 懂HTML。 认识你自己。

我编写了一个描述HTML本质的句。

HTML has
complexity exceeding
regular language.

我还撰写了一个hai句,描述了Perl中正则表达式的性质。

The regex you seek
is defined within the phrase
<([a-zA-Z]+)(?:[^>]*[^/]*)?>

#3楼

的确,在编程时,处理HTML时通常最好使用专用的解析器和API而不是正则表达式,尤其是在精度至关重要的情况下(例如,如果处理可能会带来安全隐患)。 但是,我不认为教条主义的观点是XML样式的标记永远不应使用正则表达式处理。 在某些情况下,正则表达式是完成这项工作的理想工具,例如,在文本编辑器中进行一次性编辑,修复损坏的XML文件或处理看起来像但不完全是XML的文件格式时。 有一些问题需要注意,但并非不可克服,甚至不一定是相关的。

在我刚刚提到的情况下,像<([^>"']|"[^"]*"|'[^']*')*>这样的简单正则表达式通常就足够了。 考虑到所有因素,这是一个幼稚的解决方案,但是它确实允许属性值中使用未编码的>符号。 如果要查找table标记,则可以将其修改为</?table\\b([^>"']|"[^"]*"|'[^']*')*>

只是为了大致了解“正则”的HTML正则表达式,以下代码在模拟真实浏览器行为和HTML5解析算法方面做得相当不错:

</?([A-Za-z][^\s>/]*)(?:=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)|[^>])*(?:>|$)

以下内容符合XML标记的相当严格的定义(尽管它不能解决XML名称中允许的完整Unicode字符集):

<(?:([_:A-Z][-.:\w]*)(?:\s+[_:A-Z][-.:\w]*\s*=\s*(?:"[^"]*"|'[^']*'))*\s*/?|/([_:A-Z][-.:\w]*)\s*)>

当然,这些并不能说明周围的环境和一些极端情况,但是即使您确实愿意,也可以处理此类事情(例如,通过在另一个正则表达式的匹配项之间进行搜索)。

最终,即使是正则表达式,也要使用最合适的工具来完成工作。


#4楼

如果您只是想查找这些标签(没有解析的野心),请尝试以下正则表达式:

/<[^/]*?>/g

我在30秒内写下了它,并在这里进行了测试: http//gskinner.com/RegExr/

它与您提到的标签类型匹配,而忽略了您想忽略的标签类型。


#5楼

您想要第一个>而不以/开头。 在这里查看有关如何执行此操作的详细信息。 这被称为否定性回溯。

但是,该示例的简单实现最终将在此示例文档中匹配<bar/></foo>

<foo><bar/></foo>

您能否提供更多有关您要解决的问题的信息? 您是否以编程方式遍历标签?

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!