4

我想更改 HTML 字符串中的字体大小,我必须为其大小的一半。

例如

<div style="font-family:'Arial';font-size:43px;color:#ffffff;">

将会

<div style="font-family:'Arial';font-size:21.5px;color:#ffffff;">

<div style="font-size:12px;">

将会

<div style="font-size:6px;">

我该怎么做NSRegularExpression

请注意,12 和 6 以及 43 和 21.5 只是示例。我需要正则表达式,因为它必须是不同字体大小的通用解决方案

4

4 回答 4

4

使用真正的 HTML 解析器来保持理智。用于此的 XML 解析器非常脆弱。有十几种完全有效的 HTML 语法变体会破坏 NSAddict 的表达方式。

我建议阅读这个问题上投票最多的答案,因为它同样适用于 HTML,也适用于 XHTML 或 XML。

RegEx 匹配打开的标签,XHTML 自包含标签除外

请注意,iOS / OS X 系统框架包含 HTML/XML 解析功能。使用那些。

于 2012-12-24T18:17:46.710 回答
3

你可以自己做这个NSString,实际上很容易。

[string stringByReplacingOccurrencesOfString:@"font-size:12px;" withString:@"font-size:6px;"];

复制这个函数

- (NSString *)setFontSize:(int)fontSize inHTMLString:(NSString *)htmlString {
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"font-size:[0-9]+px;" options:NSRegularExpressionCaseInsensitive error:nil];
    NSString *newString = [regex stringByReplacingMatchesInString:htmlString options:NSRegularExpressionCaseInsensitive range:NSMakeRange(0, htmlString.length) withTemplate:[NSString stringWithFormat:@"font-size:%dpx;", fontSize]];

    return newString;
}
于 2012-12-24T16:05:16.490 回答
3

我有点不愿意使用正则表达式给出答案,因为已经反复声明,使用正则表达式解析 HTML 被认为是有害的、不可能的、对你的思想有害的等等。所有这些都是正确的,我无意声称有什么不同。

但即使在所有这些警告之后,OP 也明确要求提供正则表达式解决方案,所以我将分享这段代码。它至少可以用作一个示例,如何通过遍历正则表达式的所有匹配项来修改字符串。

NSString *htmlString =
    @"<div style=\"font-family:'Arial';font-size:43px;color:#ffffff;\">\n"
    @"<div style=\"font-size:12px;\">\n";

NSRegularExpression *regex;
regex = [NSRegularExpression regularExpressionWithPattern:@"font-size:([0-9]+)px;"
                                                  options:0
                                                    error:NULL];

NSMutableString *modifiedHtmlString = [htmlString mutableCopy];
__block int offset = 0;
[regex enumerateMatchesInString:htmlString
                        options:0
                          range:NSMakeRange(0, [htmlString length])
                     usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
                         // range = location of the regex capture group "([0-9]+)" in htmlString:
                         NSRange range = [result rangeAtIndex:1];
                         // Adjust location for modifiedHtmlString:
                         range.location += offset;
                         // Get old point size:
                         NSString *oldPointSize = [modifiedHtmlString substringWithRange:range];
                         // Compute new point size:
                         NSString *newPointSize = [NSString stringWithFormat:@"%.1f", [oldPointSize floatValue]/2];
                         // Replace point size in modifiedHtmlString:
                         [modifiedHtmlString replaceCharactersInRange:range withString:newPointSize];
                         // Update offset:
                         offset += [newPointSize length] - [oldPointSize length];
                     }
 ];

NSLog(@"%@", modifiedHtmlString);

输出:

<div style="font-family:'Arial';font-size:21.5px;color:#ffffff;">
<div style="font-size:6.0px;">
于 2013-01-01T22:49:59.213 回答
1

我会为此使用 DTCoreText。它为您解析这个 HTML 并构造一个属性字符串。然后,您可以根据自己的喜好调整字体。最后,您可以使用 DTCoreText 绘制属性字符串,或者将其转换回 HTML。

如果您坚持使用 HTML,那么我可以提供 DTHTMLParser,它是基于 libxml2 的基于 SAX 的 HTML 解析器。这可以解析任何 HTML。尽管您仍然必须拆分 CSS,这并不像您想象的那么简单,即使使用 RegEx 也是如此。我在 NSString 上有一个类别,它拆分参数,以便您可以使用修改后的值重构样式。

话虽如此,我的第一个建议可能最适合您。

于 2013-01-07T06:27:30.530 回答