特定のケースのみ、正規表現(?<=)を使ったJavaScriptの「split()」メソッドが原因でReferenceErrorになってしまう?
Q&A
Closed
解決したいこと
特定のブラウザから閲覧したケースのみ
ReferenceError : Can't find variable:関数名();
エラーが発生する状況。
エラーが起こった状況
このウェブアプリ「読みやすさチェッカー」↓を開発中に発生したエラーです。
まず、アプリはWindowsとMacのGoogleChromeとFirefoxから使用する場合は問題なく動きます。
しかし、MacのSafariや、iPnoneやiPadのSafariとGoogleChromeから使用すると、JavaScriptの関数が動きませんでした。
MacのSafariのデベロッパツールで確認すると、コンソールに
ReferenceError : Can't find variable:関数名();
とのエラーが発生していました。
自分で試したこと
まず、自分なりに「ReferenceError : Can't find variable」で調べてみると、
「ブラウザのバージョンが古いのではないか」との結果が出てきました。
しかし、調べてみてもSafariは古いバージョンではありませんでした。
次に、具体的な原因を調べるためにJavaScriptのファイルを少しずつコメントアウトして比較していきました。
すると、次の2行がエラーの発生源だと分かりました。
Sentence = text.split(/(?<=。)|(?<=.)|(?<=!)|(?<=?)|(?<=<br \/>)/);
NoSpaceSentence = text.split(/(?<=。)|(?<=.)|(?<=!)|(?<=?)|(?<=<br \/>)/);
このアプリでは、文章をテキストを読点や改行で分けるために、JavaScriptの「split()」メソッドを使いました。
しかし、アプリの性質上テキストをただ分割するのではく、
読点や改行を残したいので正規表現(?<=)を使って区切り文字を直前の要素に含めています。
この部分の記述を
Sentence = text.split(/。|.|!|?|<br \/>/);
NoSpaceSentence = text.split(/。|.|!|?|<br \/>/);
こう書き換えると、MacのSafariや、iPnoneやiPadのSafariとGoogleChromeから使用してもエラーは発生しなくなりました。
ただ、これでは分割したテキストから"区切り文字に設定している読点や改行"まで消えるので、やりたい処理はちゃんとできません。
現在の状態
WindowsとMacのGoogleChromeとFirefoxからは問題なく動くので、
元々の正規表現(?<=)を使ったプログラムを実行するページと、
機能は不完全ながらエラーが出ないページの2つ用意しています。
したがって、もしも
ReferenceError : Can't find variable:関数名();
でJavaScriptが上手く動かない場合は、エラーが出ないページへの誘導↓が表示されます。
付け焼き刃感は否めません…。
ぜひ、知恵を貸していただきたいです。よろしくお願いいたします。
回答ありがとうございました!!
一晩のうちにいくつもの解決策を教えていただき、どのやり方も(?<=)を使わずに処理ができました。
とても助かり、勉強になりました。ありがとうございます。