Javascript - 调用string.search(/ regex /)occaisionally崩溃程序

时间:2013-06-06 21:56:28

标签: javascript android regex string

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

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

在字符串上调用“search()”时,javascript代码在什么情况下可能会崩溃?正则表达式本身没有任何问题,因为这在大多数情况下都有效。我也无法复制问题:如果我逐个字符地复制字符串并将其提供给应用程序外部的函数,则该函数不会崩溃。在应用程序内部,该函数在同一个字符串上崩溃。

这是功能。我以不同的方式标记警报呼叫,以便更容易看到。

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);
  }

2 个答案:

答案 0 :(得分:0)

首先,do not parse HTML with regular expressions。你被警告了。接下来,确保始终传递实际字符串。在.search()null上拨打undefined会导致问题。也许你可以提供崩溃的示例输入?

答案 1 :(得分:0)

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

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

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

而第二次使用第二次更改:(^>)$没有任何意义,因为您的模式已经开始>.+

例如,如果您想在两个先例中获得单词“rabbit”,则可以使用:/(?<=>)[^<]+/而不是

但是,使用DOM方式会更安全。