RegEx用于在HTML标签之间的块中匹配重复的内容

时间:2018-08-23 16:27:46

标签: html regex

我正在尝试使用正则表达式来获取HTML,如下所示:

<ul>
    <li>text1 (<a href="https://link1">link</a>)</li>
    <li>text2 (<a href="https://link2">link</a>)</li>
    <li>text3 (<a href="https://link3">link</a>)</li>
</ul>

并将其转换为ASCII变体,如下所示:

• text1 https://link1
• text2 https://link2
• text3 https://link3

我当前的正则表达式是这样:

/s/r/<li>(.*?)(?= \(<) \(<a href=\"(.*?(?=\"))\">link<\/a>\)<\/li>/• \1 \2/

对于核心链接来说效果很好,但我想不出要重复这种模式并擦拭开始和结束标签。我尝试将其归类为+ [],但这没有用。

有人可以协助吗?是的,我知道我当前的Regex代码很糟糕。

1 个答案:

答案 0 :(得分:2)

使用一些HTML解析器。

如果要继续使用正则表达式,可以尝试以下操作:

(?:<ul[^>]*>|<\/li>)\s*<li>(\w+)\s*.*?href="([^"]+)".*?(?=<\/li>)(?:<\/li>\s*<\/ul>)?

替换为• $1 https://$2\n

请参见 Demo

解释

(?:                     # Will start with either
    <ul[^>]*>           # <ul...> or...
  | <\/li>              # closing li (</li>)
)
\s*                     # 0 or more spaces
<li>                    # literal '<li>'
  (\w+)\s*.*?           # Capture the text of the <li>, 
                        # then spaces, any character ungreedy up to...
  href="([^"]+)"        # href="..." capture the content
  .*?                   # any character 0 or more, ungreedy
(?=<\/li>)              # followed by closing li: </li>
(?:<\/li>\s*<\/ul>)?    # It may be followed by </li>, spaces, </ul>