正则表达式获取<a href="..."> </a>之类的标签

时间:2017-11-30 18:21:36

标签: html regex href

我已经尝试过我在SOF中找到的答案,但这里没有人支持:https://regexr.com 我本质上有一个包含大量播客和描述的.OPML文件。 采用以下格式:

<outline text="Software Engineering Daily" type="rss" xmlUrl="http://softwareengineeringdaily.com/feed/podcast/" htmlUrl="http://softwareengineeringdaily.com" />

我可以使用什么正则表达式,所以我可以获得标题和链接:

  

Software Engineering Daily

     

http://softwareengineeringdaily.com/feed/podcast/

2 个答案:

答案 0 :(得分:1)

对于简单的 HTML字符串,您可能会与

相处
Url=(['"])(.+?)\1

此处,请转到$2组,参见a demo on regex101.com 强制性:考虑使用解析器(参见here)。

答案 1 :(得分:1)

有很多方法可以解决这个问题。最好的方法是使用XML解析器。我肯定会阅读讨论正则表达式使用的this post,尤其是使用XML。

正如您所看到的,您的问题有很多答案。它还取决于您使用的语言,因为正则表达式引擎不同。有些人接受反向引用,而其他人则没有。我将发布以下多种方法,这些方法适用于不同的环境/不同的正则表达方式。您可以从下面的多个正则表达式方法中拼凑出哪些部分最适合您。

代码

方法1

此方法适用于几乎所有正则表达式(至少是正常的)。

此方法仅检查"的属性值开始和结束标记,并且不包括=符号之前或之后的空格的可能性。这是获得所需值的最简单的解决方案。

See regex in use here

\b(text|xmlUrl)="[^"]*"

同样,以下方法将更多添加到上面的表达式

\b(text|xmlUrl)\s*=\s*"[^"]*"          Allows whitespace around =
\b(text|xmlUrl)=(?:"[^"]*"|'[^']*')    Allows for ' to be used as attribute value delimiter

作为另一种选择(根据我的回答下面的评论),如果你想获取除特定属性之外的每个属性,你可以使用以下内容。请注意,我使用\w,它应涵盖大多数属性,但您可以将其替换为您想要的任何有效字符。 \S可用于指定任何非空白字符,或者[\w-]等集合可用于指定任何单词或连字符。特定属性的否定发生在(?!text|xmlUrl),表示不匹配这些字符。另请注意,开头的单词边界\b可确保我们匹配text的完整属性名称,而不是具有相同终止的其他属性的可能性,例如{{1} }。

subtext

方法2

此方法仅适用于允许反向引用的正则表达式。显然,JGsoft应用程序,Delphi,Perl,Python,Ruby,PHP,R,Boost和Tcl支持单位数反向引用。 JGsoft应用程序,Delphi,Python和Boost支持两位数的反向引用。根据{{​​3}}

的信息

this article about numbered backreferences from Regular-Expressions.info

此方法使用反向引用来确保在属性值的开头和结尾使用相同的结束标记,并且还包括围绕\b((?!text|xmlUrl)\w+)="[^"]*" 符号的空白的可能性。这不允许没有指定分隔符的属性(使用=也可能有效)。

See regex in use here

xmlUrl=http://softwareengineeringdaily.com/feed/podcast/

方法3

此方法与方法2 相同,但也允许没有分隔符的属性(请注意,分隔符现在被视为空格字符,因此,它只会匹配到下一个空格)。 / p>

See regex in use here

\b(text|xmlUrl)\s*=\s*(["'])(.*?)\2

方法4

虽然方法3 有效但有些人可能会抱怨属性值可能属于2组。这可以通过以下任一方法修复。

方法4.A

分支重置组只能用几种语言,特别是JGsoft V2,PCRE 7.2 +,PHP,Delphi,R(启用PCRE),根据See regex in use here提升1.42+

这也显示了如果无法进行反向引用并且您想要匹配多个分隔符(\b(text|xmlUrl)\s*=\s*(?:(["'])(.*?)\2|(\S*))

,您将使用的方法

Regular-Expressions.info

"([^"])"|'([^']*)

方法4.B

通常不支持重复的子模式。有关详细信息,请参阅See regex in use here

此方法使用\b(text|xmlUrl)\s*=\s*(?|"([^"]*)"|'([^']*)'|(\S*)) 正则表达式标志,该标志允许重复的子模式名称(J在那里两次)

this Regular-Expresions.info article

(?<v>)

结果

输入

\b(text|xmlUrl)\s*=\s*(?:(["'])(?<v>.*?)\2|(?<v>\S*))

输出

下面的每一行代表一个不同的组。新的匹配由两行分隔。

<outline text="Software Engineering Daily" type="rss" xmlUrl="http://softwareengineeringdaily.com/feed/podcast/" htmlUrl="http://softwareengineeringdaily.com" />

说明

我将解释代码部分中使用的正则表达式的不同部分,以便您了解每个部分的用法。这更像是对上述方法的参考。

  • text Software Engineering Daily xmlUrl http://softwareengineeringdaily.com/feed/podcast/ 这是在两个"[^"]*"符号之间抓取任何东西的最快方法(据我所知)。请注意,检查转义的反斜杠,它会匹配两个"之间的任何非"字符。虽然"也可以使用,但它会稍微慢一点
  • "(.*?)"基本上是(["'])(.*?)\2的简写。您可以使用以下任何方法来获得相同的结果:
    • "(.*?)"|'(.*?)'
    • (?:"(.*?)"|'(.*?)')&lt; - 比上面一行快一点
  • (?:"([^"])"|'([^']*)')这是一个分支重置组。当您在其中放置组(?|)时,它会为两个匹配返回相同的组索引。这意味着,如果捕获(?|(x)|(y)),则它会将组索引设为1,如果捕获x,则它也会获得1的组索引。