我正在尝试从HTML输入中检索iframe
标记和属性。
示例输入
<div class="1"><iframe width="100%" height="427px" src="https://www.youtube.com/embed/1" frameborder="0" allowfullscreen=""></iframe></div>
<div class="2"><iframe width="100%" height="427px" src="https://www.youtube.com/embed/2" frameborder="0" allowfullscreen=""></iframe></div>
我一直在尝试使用以下正则表达式来收集它们:
<iframe.+?width=[\"'](?<width>.*?)[\"']?height=[\"'](?<height>.*?)[\"']?src=[\"'](?<src>.*?)[\"'].+?>
这导致
这正是我想要的格式。
问题是,如果HTML属性的顺序不同,那么这个正则表达式就不会起作用。
有没有办法修改此正则表达式以忽略属性顺序并返回iframe
中分组的Matches
以便我可以迭代它们?
答案 0 :(得分:3)
正则表达式匹配模式,字符串的结构定义了要使用的模式,因此,如果要使用正则表达式,则顺序很重要。
您可以通过两种方式处理此问题:
良好推荐方式是不使用正则表达式(mandatory link)解析HTML,而是使用解析框架,例如HTML Agility Pack。这应该允许您处理所需的HTML并提取您所追求的任何值。
第二种,糟糕,不推荐的方式这样做是为了将你的匹配分成两部分。您首先使用类似的内容:<iframe(.+?)></iframe>
来提取整个 iframe decleration,然后使用多个较小的正则表达式来查找并找到您之后的设置。如果您的iframe结构如下,则上述正则表达式显然会失败:<iframe.../>
。这应该给你一个关于为什么你不应该通过正则表达式进行HTMl解析的提示。
如上所述,您应该选择第一个选项。
答案 1 :(得分:3)
这是一个将忽略属性顺序的正则表达式:
(?<=<iframe[^>]*?)(?:\s*width=["'](?<width>[^"']+)["']|\s*height=["'](?<height>[^'"]+)["']|\s*src=["'](?<src>[^'"]+["']))+[^>]*?>
C#示例代码:
var rx = new Regex(@"(?<=<iframe[^>]*?)(?:\s*width=[""'](?<width>[^""']+)[""']|\s*height=[""'](?<height>[^'""]+)[""']|\s*src=[""'](?<src>[^'""]+[""']))+[^>]*?>");
var input = @"YOUR INPUT STRING";
var matches = rx.Matches(input).Cast<Match>().ToList();
输出:
答案 2 :(得分:1)
您需要使用OR运算符(|)。请参阅下面的更改
sqlservice.getAllCases().then(function(data) {
console.log(data);
$scope.items = [];
for (var i = 0; i < data.length; i++)
$scope.items.push(data[i]);
console.log($scope.items);
})
答案 3 :(得分:1)
您可以使用此正则表达式
<iframe[ ]+(([a-z]+) *= *['"]*([a-zA-Z0-9\/:\.%]*)['"]*[ ]*)*>
它递归匹配每个'name'='value'对并在匹配中以相同的顺序存储它,您可以遍历mathes以顺序获取名称和值。适合大多数字符值,但如果需要,您可以添加更多字符。
答案 4 :(得分:1)
使用Html Agility Pack(通过nuget获得):
using System;
using HtmlAgilityPack;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
HtmlDocument doc = new HtmlDocument();
doc.Load("HTMLPage1.html"); //or .LoadHtml(/*contentstring*/);
HtmlNodeCollection iframes = doc.DocumentNode.SelectNodes("//iframe");
foreach (HtmlNode iframe in iframes)
{
Console.WriteLine(iframe.GetAttributeValue("width","null"));
Console.WriteLine(iframe.GetAttributeValue("height", "null"));
Console.WriteLine(iframe.GetAttributeValue("src","null"));
}
}
}
}