0

Android 用のネイティブ JavaScript アプリを作成していますが、短い正規表現呼び出しが必要です。次の関数は、html のブロックから内側の文字列を選択し、長すぎる場合は短くしてから、html ブロッ​​クに追加し直します。(とにかくほとんどの場合 -- 完全な html パーサーを書くことはできませんでした。)

私の問題は、特定の入力で、このコードがコマンド「str.search(regex)」でクラッシュすることです。(コマンド「Pre-regex string:」の直前にアラートステートメントを出力しますが、その後の「Pos:」は出力しません。)アプリはAndroidで実行されているため、どのエラーが発生しているのかわかりません投げた。

文字列に対して「search()」を呼び出すと、どのような状況で JavaScript コードがクラッシュする可能性がありますか? これはほとんどの場合に機能するため、正規表現自体に問題はありません。問題を再現することもできません。文字列を 1 文字ずつコピーしてアプリの外部の関数にフィードしても、関数はクラッシュしません。アプリ内では、同じ文字列で関数がクラッシュします。

これが関数です。見やすくするために、アラート コールのタブを変更しました。

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

まず、HTML を正規表現で解析しないでください。あなたは警告されました。次に、常に実際の文字列を渡すようにします。orを呼び出す.search()と、問題が発生します。たぶん、クラッシュしている入力例を提供できますか?nullundefined

于 2013-06-06T22:26:52.240 に答える
0

IMO、文字列の開始後に開始アンカー ^ を使用するため、正規表現はエラーを生成します。例えば:

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

その理由は、最初に最初の代替を使用するためです。つまり、次のようになります。<

2番目は2番目の代替(^>)$を使用します。パターンはすでに>.+

たとえば、前の 2 つのケースで「rabbit」という単語を取得したい場合は、/(?<=>)[^<]+/代わりに次のように使用できます。

ただし、DOM の方法を使用する方が安全です。

于 2013-06-06T22:29:50.930 に答える