当字符串包含多个双引号时,从字符串中提取URL的Regex失败

本文关键字:字符串 提取 URL Regex 失败 包含多 | 更新日期: 2023-09-27 17:53:51

我使用regex从字符串中提取url,它基本上可以工作;

var regex=new Regex("<a [^>]*href=(?:'(?<href>.*?)')|(?:'"(?<href>.*?)'")",RegexOptions.IgnoreCase);

以下字符串运行良好:

"This is Test page <a href='test.aspx'>test page</a>"
"This is Test page <a href='test1.aspx'>test</a> another one <a href='test2.aspx'>test</a>"
"This is Tests'"s page <a href='test1.aspx'>test</a> another one <a href='test2.aspx'>test</a>"
"This is Test page"
"This is Test page'"s without problem"

但一段时间后,结果并不好。以下代码返回错误结果(string contains 2 double quotes(-

var inputString="This string create '"problem'" for me";    
var regex=new Regex("<a [^>]*href=(?:'(?<href>.*?)')|(?:'"(?<href>.*?)'")",RegexOptions.IgnoreCase);    
var urls=regex.Matches(inputString).OfType<Match>().Select(m =>m.Groups["href"].Value);    
foreach(var zzzzzzz in urls){
  Console.WriteLine(zzzzzzz);
}

有问题的演示

有人能帮我解决这个问题吗?

当字符串包含多个双引号时,从字符串中提取URL的Regex失败

也许您可以这样更改正则表达式:<a .*?href=(?:['"](?<href>[^'"]*?)['"])关于Csharp:"<a .*?href=(?:[''"](?<href>[^''"]*?)[''"])"

解决方案:

您应该使用HTML Parser来消除当前和将来的麻烦。例如,可以在这里找到一个经过测试的工作示例。

Regex解释:

至于您的regex,它目前失败了,因为您没有将其包含在一个组中。因此,它可以返回内部没有<a... href的字符串。此外,您当前的正则表达式还可能存在其他问题。

"固定"regex(意味着它将能够处理转义实体以及双引号和单引号(看起来像:

(?i)<a'b[^<]*href=(?:(?:'(?<href>[^''']*(?:''.[^''']*)*)')|(?:'"(?<href>[^''']*(?:''.[^''']*)*))'")

但是在解析HTML时,您不太可能完全依赖regex。使用解决方案,而不是变通方法。