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 パーサーは非常に脆弱です。NSAddict の表現を壊す、HTML 構文の完全に有効なバリエーションが十数個あります。

XHTML や XML と同様に HTML にも同様に適用されるため、この質問に対するトップ投票の回答を読むことをお勧めします。

正規表現は、XHTML 自己完結型タグを除く開始タグに一致します

iOS / OS X システム フレームワークには、HTML/XML 解析機能が含まれていることに注意してください。それらを使用します。

于 2012-12-24T18:17:46.710 に答える
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 に答える
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 に答える
1

そのためにDTCoreTextを使用します。このHTMLを解析して、属性付きの文字列を作成します。次に、お好みに合わせてフォントを調整できます。最後に、DTCoreTextを使用して属性付き文字列を描画するか、HTMLに変換し直すことができます。

HTMLを主張する場合は、libxml2に基づくSAXベースのHTMLパーサーであるDTHTMLParserを提供できます。これにより、任意のHTMLを解析できます。ただし、正規表現を使用した場合でも、CSSを分割する必要があります。これは思ったほど簡単ではありません。NSStringには、変更された値でスタイルを再構成できるようにパラメーターを分割するカテゴリーがあります。

そうは言っても、あなたはおそらく私の最初の推薦によって最もよく仕えられます。

于 2013-01-07T06:27:30.530 に答える