Javascript——调用string.search(/regex/)偶尔会导致程序崩溃

Javascript -- call to string.search(/regex/) occaisionally crashes program

本文关键字:程序 崩溃 偶尔 regex string 调用 search Javascript      更新时间:2023-09-26

我正在为android编写一个原生javascript应用程序,它涉及一个简短的正则表达式调用。下面的函数应该从html块中选择内部字符串,如果它太长,将其缩短,然后将其添加回html块。(大多数时候——我写不出一个完美的html解析器。)

我的问题是,在某些输入上,此代码在命令"str.search(regex)"上崩溃。(它在命令"Pre-regex string:"之前打印警告语句,但不打印后面的"Pos:"。)由于应用程序在android上运行,我无法看到抛出什么错误。

在什么情况下javascript代码可能崩溃时调用"search()"的字符串?regex本身没有任何问题,因为它在大多数情况下都是有效的。我也不能重复这个问题:如果我一个字符一个字符地复制字符串并将其输入到应用程序外部的函数中,该函数不会崩溃。在应用程序内部,该函数在同一个字符串上崩溃。

函数如下。我用不同的标签来标记提醒调用,使它们更容易看到。

trimHtmlString: function(str, len, append) {
    append = (append || '');
    if(str.charAt(0) !== '<') {
      if(str.length > len) return str.substring(0, len) + append;
      return str;
    }
      alert('Pre-regex string: '+str);
    var regex = />.+(<|(^>)$)/;
    var innerStringPos = str.search(regex);
    if(innerStringPos == -1) return str;
      alert('Pos: '+innerStringPos);
    var innerStringArray = str.match(regex);
      alert('Array: '+innerStringArray);
    var innerString = innerStringArray[0];    
      alert('InnerString: '+innerString);
    var innerStringLen = innerString.length;
    innerString = innerString.substring(1, innerString.length-1);
      alert(innerString.length);
    if(innerString.length > len) innerString = innerString.substring(0, len) + append;
    return str.substring(0, innerStringPos+1)
            + innerString
            + str.substring(innerStringPos+innerStringLen-1, str.length);
  }

首先,不要用正则表达式解析HTML。我已经警告过你了。接下来,确保总是传递一个实际的字符串。在nullundefined上调用.search()会导致问题。也许您可以提供一个崩溃的示例输入?

IMO,您的正则表达式生成错误,因为您在字符串开始后使用开始锚^。例如:

<span>rabbit</span>   don't generate an error
<span>rabbit          generate an error

的原因是第一次使用第一次交替,即:<

和第二个使用第二个替代:(^>)$,这没有意义,因为您的模式已经从>.+

开始了

例如,如果您想在前面两个例子中获得单词"rabbit",您可以使用:/(?<=>)[^<]+/代替