我正在为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);
}
答案 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方式会更安全。