此问题类似于“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>
答案 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");