允许在javascript str.replace中使用换行符

时间:2013-06-06 23:45:57

标签: javascript regex newline

此问题类似于“Allowing new line characters in javascript regex” 但解决方案/m不能与str.replace一起运行。您可以在this page

上测试以下代码
 <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>

2 个答案:

答案 0 :(得分:1)

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

m没有帮助的原因是另一个答案是错误的。这不是m的作用。 m除了字符串的开头和结尾之外,还简单地使锚点匹配行的开头和结尾。一些正则表达式的风格对于你想要完成的事情有s,但不是ECMAScript。最简单的事情(和一般解决方案)是将.(除了换行符之外的所有内容)替换为[\s\S](它匹配空格和非空格,即所有内容)。

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

总而言之,using regex to parse HTML is wrong!你应该真的使用DOM操作。 特别是,因为您使用的是Javascript - DOM操作的语言。您应该做的是遍历i元素中所有demo标记的DOM,并将其替换为内部HTML。

答案 1 :(得分:0)

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

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

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

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

请注意,我的解决方案假设您没有任何&lt;在<i></i>

之间

在另一种情况下,例如,当你有嵌套标签时,你可以使用这个技巧来避免延迟量词:

var n=str.replace(/<i>((?:[^<]+|<+(?!\/i>)+)<\/i>/,"$1");