允许在javascript中添加新的行字符

Allowing new line characters in javascript str.replace

本文关键字:字符 添加 javascript      更新时间:2023-09-26

这个问题类似于"允许javascript regex中的新行字符"但/m不能与str.replace一起运行。您可以在本页

测试下面的代码
 <p id="demo"><i>I need to TRIM the italics here, 
  despite this line.</i>
 </p>
 <button onclick="myFunction()">Try it</button>
 <script>
 function myFunction()
 {
 var str=document.getElementById("demo").innerHTML; 
 var n=str.replace(/^('s*)<i>(.+)<'/i>('s*)$/m,"$1$2$3"); //tested also /s
 alert(str)
 document.getElementById("demo").innerHTML=n;
 }
 </script>

这个答案主要是为了让您了解当前方法不起作用的原因,以及您通常如何解决它。

m不起作用的原因是另一个答案是错误的。这不是m所做的。m只是使锚匹配字符串的开始和结束,而不是字符串的开始和结束。有些正则表达式有s来实现您想要实现的功能,但ECMAScript没有。最简单的事情(和一般解决方案)是用['s'S](匹配空白和非空白,即所有内容)替换.(匹配除换行符外的所有内容)。

然而,卡西米尔的方法更适合你,因为它避免了一些其他问题,比如贪婪。当然,正如Casimir所说,如果在开始和结束<i>标记之间有标记,那么这种方法将不起作用。在这种情况下,像<i>(['s'S]+?)</i>这样的东西可能是一个选择,但这仍然不是完整的解决方案,如果您在开始标记中嵌套i -标签或属性,或大写I -标签和诸如此类的东西。

总之,使用正则表达式解析HTML是错误的!您应该真正使用DOM操作。特别是,因为您正在使用Javascript -用于DOM操作的语言。您真正应该做的是遍历demo元素中所有i标记的DOM,并用它们的内部HTML替换它们。

避免换行问题的一种方法是不使用点,例如:

var n=str.replace(/<i>([^<]+)<'/i>/,"$1");

我用[^<]替换了点(所有不是<,包括换行符)

这里不需要m修饰符,也不需要捕获白色字符。

注意,我的解决方案假设你没有任何<<i></i>之间>

在另一种情况下,例如,当您有嵌套标记时,您可以使用以下技巧来避免惰性量词:
var n=str.replace(/<i>((?:[^<]+|<+(?!'/i>)+)<'/i>/,"$1");