我正在尝试使用正则表达式来获取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代码很糟糕。
答案 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>