我看到了这个关于关闭 img 标签的问题和答案。
但是,如果我还想关闭其他标签(如链接)怎么办?
我试着写
(<img|link[^>]+)(?<!/)>
但这行不通
怎么了?
例子:
<link href="myhref">
<img src="mysrc">
但不是
<link href="myhref"/>
<img src="mysrc"/>
您需要限制交替的范围。否则,<
只有在交替的左边部分匹配时[^>]+
才会匹配,并且只有在右边部分匹配时才会匹配。
(<(?:img|link)[^>]+)(?<!/)>
应该解决这个问题。(?:...)
是非捕获组,即仅用于分组,不用于捕获。替换操作 (with \1/>
) 保持不变。
KissXML 应该能够解析它......
它以 xml 模式包装 libxml2 但回退到 html 模式!
它工作得很好:D 真的(正如我一直说的那样;))
- (void)processNode:(DDXMLNode*)node {
if(node.kind==DDXMLElementKind) {
NSLog(@"%@", node.name);
for (id child in node.children) {
[self processNode:child];
}
}
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
id sample = @"<link href=\"myhref\"><img src=\"mysrc\">";
id data = [sample dataUsingEncoding:NSUTF8StringEncoding];
DDXMLDocument *doc = [[DDXMLDocument alloc] initWithData:data options:DDXMLDocumentTidyHTML error:nil];
[self processNode:doc.rootElement];
}
您需要使用 HTML 解析器或基于 libxml2 的解析器。在 Objective-c 中有一个名为hpple的 libxml2 包装器。hpple可以毫无问题地解析凌乱的 HTML。