0

我正在为 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);
  }
4

2 回答 2

0

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

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

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

第二个使用第二个交替:(^>)$那没有意义,因为你的模式已经开始了>.+

例如,如果你想获得前面两个案例中的“兔子”这个词,你可以使用:/(?<=>)[^<]+/代替

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

于 2013-06-06T22:29:50.930 回答
0

首先,不要使用正则表达式解析 HTML。你被警告了。接下来,确保您始终传递一个实际的字符串。调用或将导致问题.search()。也许您可以提供一个崩溃的示例输入?nullundefined

于 2013-06-06T22:26:52.240 回答