替换文本中的空格而不影响html标记

时间:2014-02-26 09:03:35

标签: html objective-c regex

我需要用 替换html中的空格,但不要影响其中的空格。

这样的事情:Hello <font color="red"> How Are <font color="black"> You? 会变成这样:Hello&nbsp;<font color="red">&nbsp;How&nbsp;Are&nbsp;<font color="black">&nbsp;You?

它改变了标签外面的空间,但是标签内的空间没有受到影响。


我尝试了以下某人建议的示例代码:

 NSString *string = originalHTMLString;

 NSError *error = nil;
 NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?i)(<script(?:[^>\"']|\"[^\"]*\"]|'[^']*')*>)\s+</script\\s*>|<style(?:[^>\"']|\"[^\"]*\"]|'[^']*')*>)\s+</style\\s*>|<textarea(?:[^>\"']|\"[^\"]*\"]|'[^']*')*>)\s+</textarea\\s*>|</?[a-z](?:[^>\"']|\"[^\"]*\"]|'[^']*')*>|\\S+)|\\s+" options:NSRegularExpressionCaseInsensitive error:&error];
 NSString *modifiedString = [regex stringByReplacingMatchesInString:string options:0      range:NSMakeRange(0, [string length]) withTemplate:@" &nbsp;"];

 finalHTMLString = modifiedString;

但它没有用。刚刚返回Null,我认为RegEx模式是错误的。


这是我必须转换的一些示例html:

  <samp class="s22">من مشاكل جرّأء العثّ والفيروسات منذ سنوات. إلاّ أنّ أمرًا ما حدث في الأعوام الماضية وسبّب المشكلة".</samp></p> <p class="mytext-19" dir="RTL"><samp class="s20">ويعتقد هاكينبرغ أنّ الأمر بدأ منذ عام </samp><samp class="s21">2004</samp><samp class="s22">. ففي أيار ذلك العام، اشتكى مزارعو العنبيّة في ماين من أنّ نحلهم الذي يلقّح محصولهم كان يُنتج طرودًا ويغادر الخلايا. كما أنّ نحل الخلايا الأخرى لا يسرق العسل الموجود في الخليّة المتروكة.</samp></p> <p class="mytext-19" dir="RTL"><samp class="s20">وحين بحث عن تفسير لهذا السلوك الغريب، اكتشف أنّ مزارعي التفاح في واشنطن استعملوا مبيدًا جديدًا يحتوي على النيونيكوتينوييد يُدعى </samp><samp dir="LTR">Assail</samp><samp class="s22"> لأشجارهم. وكان نحله يلقّح تلك الأشجار في الربيع.</samp></p> <p class="mytext-19" dir="RTL"><samp class="s20">ذاك الشتاء (</samp><samp class="s21">2004</samp><samp class="s22">-</samp><samp class="s21">2005</samp><samp class="s22">)، خسر ثلثَ نحله تقريبًا، وهي نسبة أعلى بكثير من المعتاد. وفي العام التالي نفق النصف كما أُبلغ عن خسائر في مختلف أنحاء البلاد.</samp></p> <p class="mytext-19" dir="RTL"><samp class="s20">يقول هاكنبيرغ: "لقد ساءت الأمور جدًّا، ولكنّ أحدًا لم يتمكّن <samp class="s37">من معرفة السبب". لهذا، ففي صيف عام </samp></samp><samp class="s61">2006</samp><samp class="s38"> عقد اجتماعًا مع علماء في نبراسكا ليحاول إيجاد سبب للارتفاع السريع في معدّل نفوق </samp><samp class="s26">النحل. "قيل إنّ الاجتماع ضمّ أذكى العقول ولكنّنا جلسنا ليومين نتباحث من دون التوصّل لشيء". وبعد بضعة أشهر هلك ثلثا ما تبقّى من نحله.</samp></p> <p class="mytext-19" dir="RTL"><samp class="s20">أعطى النحّالون الذين نقلوا </samp><samp class="s21">1</samp><samp class="s22">.</samp><samp class="s21">2</samp><samp class="s22"> مليون قفير إلى بساتين اللوز في كاليفورنيا في شباط أوّل مؤشر على صحة النحل عام </samp><samp class="s21">2008</samp><samp class="s22">. لم تكن الإشارات جيّدة. <a class="MyAppHighlight1" style="background-color:pink; color:black;" name="M10">فمن بين الاثني عشر نحّالاً تقريبًا الذين تحدثنا إليهم</a>، اثنان منهم فقط دخلوا الشتاء سالمين نسبيًّا. أمّا الباقون فخسروا ما يتراوح بين </samp><samp class="s21">30</samp><samp class="s22"> بالمئة و</samp><samp class="s23">60</samp><samp class="s22"> بالمئة من قفرلوا الشتاء سالمين نسبيًّا. أمّا الباقون فخسروا ما يتراوح بين </samp><samp class="s21">30</samp><samp class="s22"> بالمئة و</samp><samp class="s23">60</samp><samp class="s22"> بالمئة من قفر\330انهم بما بدا شبيهًا بداء <samp class="s37">انهيار الخليّة. ومن بين عمليات الهجرة الاثنتي عشرة التي تابعتها وزارة </samp>الزراعة الأميركيّة من أيلول <samp class="s37">العام </samp></samp><samp class="s21">2007</samp><samp class="s22"> وحتّى ربيع <samp class="s37">العام </samp></samp><samp class="s21">2008</samp><samp class="s22">، ظهر في خمس </samp><samp dir="LTR" class="s2"><span style="display:none;">00002</span> </samp><a style="color:transparent;" name="00003"></a><samp><span style="display:none;">00003</span></samp></p> <p class="bigtitle">&nbsp;</p> <p class="bigtitle">&nbsp;</p> <p class="bigtitle-3" dir="RTL"><samp class="s4">عَالَمٌ بِلا نَحْل</samp></p> <p class="bigtitle-3" dir="RTL"><samp dir="LTR" class="s5">A World Without Bees</samp></p> <p class="mo2allef">&nbsp;</p> <p class="mo2allef">&nbsp;</p> <p class="smallertitleCxSpFirst-6" dir="RTL"><samp class="s7">تأليف</samp><samp class="s8">:</samp></p><p>&nbsp;</p>

感谢您的协助。

1 个答案:

答案 0 :(得分:1)

这不是RegEx的答案,但在Objective-C中,这应该使用一个名为originalHTML的字符串,切换标签之外的所有空格,并将其保存为名为finalHTML的字符串

NSString *originalHTML = @"Your backslashed HTML Here";
NSString *finalHTML = [[NSMutableString alloc] init];
BOOL insideTag = NO;
BOOL convertSpace = NO;

for (int i = 0; i < originalHTML.length; i++) {

    unichar uniCharacter = [originalHTML characterAtIndex:i];
    if ([[NSString stringWithFormat:@"%C", uniCharacter] isEqualToString:@"<"]) {
        insideTag = YES;
    }
    if ([[NSString stringWithFormat:@"%C", uniCharacter] isEqualToString:@">"]) {
        insideTag = NO;
    }

    if (!insideTag) {
        if ([[NSString stringWithFormat:@"%C", uniCharacter] isEqualToString:@" "]) {
            convertSpace = YES;
        }
    }

    if (!convertSpace) {
        finalHTML = [finalHTML stringByAppendingFormat:[NSString stringWithFormat:@"%C", uniCharacter]];
    } else {
        finalHTML = [finalHTML stringByAppendingFormat:@"&nbsp;"];
        convertSpace = NO;
    }

}

NSLog(@"%@", finalHTML);

*请注意,如果您的html正文中的符号小于或大于不是标记的一部分,则此功能无效。如果你需要写小于&lt;或大于>在您的实际正文中,请使用&lt;&gt;