定期快报-javascript

Regular Express issue - javascript

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

我正在尝试使用如下正则表达式替换javascript中的文本[我正在尝试做的示例]:

<html><head></head>
<body>
  <div id="div1"><a href="#" title="This is Old">This is Old</a></div>
  <script> 
    var message = "Hi";
    var str = document.getElementById("div1").innerHTML;
    var newstr = str.replace(/Old/g, "<div onclick='say('""+message+"'");'>New</div>");
    document.getElementById("div1").innerHTML = newstr;
    function say(message)
    {
      alert(message);
    }
  </script>
</body>
</html>

这是我试图在大型应用程序中执行的操作的示例代码。我们的脚本是在第三方html页面中注入的,所以我们无法控制html。如果您运行此代码,您将看到文本似乎已损坏,如果您只是从title标记中删除"Old",它将正常工作。我无法更改html,所以我必须修改脚本来处理此问题。

有没有一种方法可以让我放一些正则表达式,如果它发生在"<"answers">"之间,可以绕过文本的替换?或者用其他方法来解决这个问题。

我无法使用DOM进行替换,因为当文本太多时,它会导致页面崩溃,我正在进行整页文本替换。

提前感谢您的帮助:)

编辑:更改代码使其工作:)

I可能不相关,但您可能需要在替换的文本中替换消息变量。由于您在本地声明了消息变量,因此它在外部不可用。

编辑:
对于你的问题,你可以用RegEx做到这一点,但这将非常困难。如果我有时间的话,我可能会努力一点。

第2版:
试试这个,它可以确保Old不在标签中。

>[^><]*(Old)[^<>]*<

第3版:
这也适用于文件,启动>不是必需的

[^><]*(Old)[^<>]*<

编辑4:

<html><head></head>
<body>
  <div id="div1"><a href="#" title="This is Old">This is Old</a></div>
  <script> 
    var message = "Hi";
    var str = document.getElementById("div1").innerHTML;
    var newstr = str.replace(/([^><]*)Old([^<>]*<)/g, "$1<div onclick='say('""+message+"'");'>New</div>$2");
    document.getElementById("div1").innerHTML = newstr;
    function say(message)
    {
      alert(message);
    }
  </script>
</body>
</html>

进行替换:

str.replace(/(>[^<]*)Old/g, "$1<div onclick='say('"message'");'>New</div>");

这基本上意味着"旧的不在HTML标签中"

将id分配给<a>元素,然后在其innerHTML(不应包含标签的title属性)上运行相同的replace():

<html><head></head>
<body>
  <div id="div1"><a id="link" href="#" title="This is Old">This is Old</a></div>
  <script> 
    var message = "Hi";
    var str = document.getElementById("link").innerHTML;
    var newstr = str.replace(/Old/g, "<div onclick='say('"message'");'>New</div>");
    document.getElementById("link").innerHTML = newstr;
    function say(message)
    {
      alert(message);
    }
  </script>
</body>
</html>