2014-02-26 40 views
0

我需要用 替換html中的空格,但不影響裏面的空格。在不影響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; 

但沒有奏效。剛剛返回空,我認爲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

這不是一個正則表達式的答案,但在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;&gt;

+0

阿爾貝,不能多謝你,真的是你救了我的一天。非常感謝你,我真希望你在你的生活中取得成功。 – coder

+0

Albert我遇到了這個功能的問題,當我有一個大的html文件時,它耗盡了內存,並以「內存錯誤」破壞了應用程序 – coder

+0

@coder你沒有啓用ARC嗎?我在寫這篇文章的時候記住了哈哈......我們可能希望*拋出所有的'[NSString stringWithFormat',然後在每次運行循環時釋放它們。 –

相關問題