正規表現のパターンで悩んでいます。環境はPC・モバイルのブラウザで、JavaScript内で正規表現を使用しています。
HTML内に記述されている英単語に一括してaタグを付けたいので、以下のような正規表現で置換を実行しています。
regularExpression = /([a-zA-ZÀ-ÿ]+)/g;
これで概ね問題なく置換ができているのですが、HTMLのエスケープ文字がある文書の場合、中間部分にヒットしてしまいます。<であればltにヒットします。
これを避けるため、否定後読みで対応しようとしたのですが、
regularExpression = /((?<!&)[a-zA-ZÀ-ÿ]+)/g;
これですと、<であればtにヒットします。lが&の存在によりアンマッチとなった次に、tからマッチングを開始してtがマッチしたのだと推測しています。
HTMLエスケープの末尾の;は、英文中でも単語末尾に登場しますので、後読み無しで単独で使用することはできません。
そこで、先読みと組み合わせて、
regularExpression = /((?<!&)[a-zA-ZÀ-ÿ]+(?!;))/g;
前後を条件として記述したところ、PC環境のChromeでは成功する(HTMLエスケープ以外の英単語にマッチする)のですが、MacのSafariとモバイル環境SafariとChromeでは、なぜか、HTMLエスケープだけでなく、すべての単語にマッチしなくなります(先の2つのパターンはいずれの環境でもマッチング結果は同じです)。
なお、
・英文の空白部分にはマッチさせたくないので、「空白に続くアルファベット文字列」というパターンは使用したくありません。
・文章全体の置換なので重い処理ですから、予めHTMLエスケープ文字を代替文字に置換しておいて、もう一度HTMLエスケープに戻すという2回の置換を行う策は避けたいです。
できれば正規表現による置換だけで目的を達成したいのですが、手詰まりになってしまいました。皆様お知恵拝借させて下さい。よろしくおねがいします。
回答1件
あなたの回答
tips
プレビュー