0

这个问题类似于“在 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>
4

2 回答 2

1

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

m没有帮助的原因是另一个答案是错误的。这不是什么mm除了字符串的开头和结尾之外,只需使锚点匹配行的开头和结尾。一些正则表达式风格具有s您想要完成的功能,但不是 ECMAScript。最简单的事情(也是通用的解决方案)是将.(匹配除换行符之外的所有内容)替换为[\s\S](匹配空白和非空白,即所有内容)。

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

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

于 2013-06-07T01:04:48.457 回答
0

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

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

我已将点替换为[^<](所有不是<,包括换行符)

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

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

在另一种情况下,例如,当您有嵌套标签时,您可以使用此技巧来避免惰性量词:

var n=str.replace(/<i>((?:[^<]+|<+(?!\/i>)+)<\/i>/,"$1");
于 2013-06-06T23:52:13.120 回答