在不影响 html 标签的情况下替换文本中的空格
Posted
技术标签:
【中文标题】在不影响 html 标签的情况下替换文本中的空格【英文标题】:replace space in text without affecting html tags 【发布时间】:2014-02-26 09:03:34 【问题描述】:我需要将 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:@" "];
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"> </p> <p class="bigtitle"> </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"> </p> <p class="mo2allef"> </p> <p class="smallertitleCxSpFirst-6" dir="RTL"><samp class="s7">تأليف</samp><samp class="s8">:</samp></p><p> </p>
感谢您的帮助。
【问题讨论】:
【参考方案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:@" "];
convertSpace = NO;
NSLog(@"%@", finalHTML);
*注意,如果您的 html 正文中只有一个小于号或大于号而不是标签的一部分,这将不起作用。如果您需要在实际正文中写出小于,请使用&lt;
或&gt;
【讨论】:
Albert,非常感谢你,真的是你拯救了我的一天。非常感谢你,我真诚地祝你在你的生活中取得成功。 Albert 我遇到了这个函数的问题,当我有大 html 文件时,它会耗尽内存并以“由于内存错误”而中断应用程序 @coder 你没有启用 ARC 吗?我写这个是考虑到这一点哈哈......我们可能想*投射我们所有的[NSString stringWithFormat
,然后在每次运行循环时释放它们。
Albert 非常感谢您迄今为止的帮助,我从事这个项目已有 3 年了,当时 arc 不存在我一直在寻找这个选项,如果我现在想使用我将不得不在我的代码中更改很多东西。有没有其他选择?
@coder Sure :D 你不需要 ARC 来让这段代码工作你只需要手动释放内存......我不是最擅长这样做哈哈,当我开始编写重型处理应用程序,ARC 存在。您应该使用带有“内存管理”标签的代码 sn-p 发布另一个问题。不幸的是,我无法像我一样回答这个问题,但这个网站上的其他人肯定可以! (可能甚至在今天!)祝你好运,我的男人!以上是关于在不影响 html 标签的情况下替换文本中的空格的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 Javascript 对标签本身进行编码的情况下对可能具有 html 标签的文本进行 HTML 编码
如何在不使用 UIWebView 的情况下在 iOS 10 中显示带有 HTML 标签的文本(使用 swift)