現在デフォルトスキンとして「Season (Summer)」を適用中。

正規表現リテラルが特定のパターンを含むとJavaScript縮小化でエラーする | 不具合報告 | Cocoon フォーラム

書き込みの前に以下の3点をご確認ください。
  1. 1つのトピックにつき1つの質問を書き込んでください
  2. 不具合・カスタマイズ対象ページのURLを提示してください
  3. 該当部分のキャプチャ・環境情報とともに書き込んでいただけると助かります

フォーラム利用ガイドリンク

  1. フォーラムガイドライン
  2. よくある質問と答え(FAQ)
  3. サポート対象外のケース
  4. 原因不明の不具合用トラブルシューティング
  5. トピックにHTMLを貼り付ける方法(推奨ツール:notepad.pw
  6. 真っ白画面でのエラーメッセージの確認方法 
  7. ブラウザ環境チェックツール

フォーラムの内容は、CCライセンス(CC BY-ND 2.1)準じていれば(リンクを貼っていただければ)転載も自由です。カスタマイズ記事を書く際にコード等をコピペ利用していただいて構いません。

フォーラムの使い方がよくわからない場合は、テストトピックで自由にテストしていただいて構いません。

フォーラムのTwitterアカウント(@CocoonForum)はこちら

スポンサーリンク
正規表現リテラルが特定のパターンを含む...
 
Share:

正規表現リテラルが特定のパターンを含むとJavaScript縮小化でエラーする  

  RSS

hiromi
(@hiromi)
Trusted Member
参加: 12か月 前
投稿: 52
2019年1月19日 12:02  

こんにちは
JavaScript縮小化で一つ問題を見付けましたのでご報告させて頂きます。
例えばcocoon-child-master子テーマのjavascript.jsに以下の記述があると、

jQuery(function ($) {
var str = '/001/';
var ismatch = str.match(/\/([0-9]+)\//); //ここでエラー発生
if (ismatch) {
alert('matchした:'+str);
}
});

JavaScript縮小化が無効なら正常にalertが実行されますが、
JavaScript縮小化が有効化されていると、以下のエラーメッセージが出て中断します。

Uncaught SyntaxError: Invalid regular expression: missing /
(Chromeの場合です)

少し調べた限りでは、上コードのように正規表現リテラル形式だとエラーが出ます。
でも、正規表現パターンを文字列で記述すればエラーは出ませんでした。

var ismatch = str.match('\/([0-9]+)\/'); //正常動作

同様に、以下のようにしてもエラーしました。

var regex = /\/([0-9]+)\//; // エラーする
var regex = '\/([0-9]+)\/'; // 正常動作
var ismatch = str.match(regex);

さらに少し調べてみましたが、
正規表現リテラルの中に \/ が2個以上の偶数個含まれるとエラーが再現するようです。
そんな特殊なパターンは滅多に無いとは思いますが、念のために報告させていただきました。

また、私の場合は文字列形式で正規表現パターンを与えるようにして対処できましたので、今のところ困っていません。


引用
わいひら
(@yhira)
メンバーサイト Admin
参加: 2年 前
投稿: 6125
2019年1月19日 15:59  

取り急ぎご報告。
この不具合も含めて、新バージョンのライブラリは、何故かURLが消えてしまうという不具合(feedly以外)がありました。
なので、他に何か影響があることも考え、ライブラリを旧バージョンに戻しました。
こちらだと、JavaScriptの不具合は再現されますでしょうか。
https://github.com/yhira/cocoon/archive/master.zip

ライブラリを旧バージョンに戻したことにより、以前の不具合は復活したと思います。
Cocoonのhtml縮小化を有効にするとpreタグの先頭の空白が消える | 不具合報告 | Cocoon フォーラム

ただ、新旧バージョンの不具合を照らし合わせた場合、新バージョンの不具合の方が重大なので、一旦旧バージョンに戻します。


返信引用
hiromi
(@hiromi)
Trusted Member
参加: 12か月 前
投稿: 52
2019年1月19日 16:53  

>こちらだと、JavaScriptの不具合は再現されますでしょうか。

早速試しましたが、やはり再現しました。

html, css, JSのminify機能はサイト全体に影響が出ますから難しいですね。


わいひら 件のいいね!
返信引用
わいひら
(@yhira)
メンバーサイト Admin
参加: 2年 前
投稿: 6125
2019年1月19日 19:27  

そうしたら、ライブラリが元々持っている不具合っぽいですね。

ライブラリのアップデートは、サイト全体にどのような影響が出るか予期できないので恐ろしいです^^;
修正するにしても、ものすごい解読コストがかかります(解読できない可能性の方が高い)ので、今のところはアップデートを待つしかないかもしれません。


返信引用
hiromi
(@hiromi)
Trusted Member
参加: 12か月 前
投稿: 52
2019年1月19日 21:24  

こんにちは
少し調べてみたのですが、
php-html-css-js-minifier.php
では、
正規表現リテラルを検出する正規表現パターンが以下のように定義されていますが、

define('MINIFY_PATTERN_JS', '/[^\n]+?/[gimuy]*');

これだと、+? の最短マッチがありますので、以下の文字列

"var regex = /\/([0-9]+)\//;"

は、こんな風に分解されました。

"var regex = "
"/\/"
"([0-9]+)\"
"//;"

その結果、最後の部分文字列は "//;" なのでコメントと解釈されて除去されて、最終的なminifyコードで不具合が出るようです。

もし、最短マッチではなく、単純に

define('MINIFY_PATTERN_JS', '/[^\n]*/[gimuy]*');

とすると、以下のように分解されて、

"var regex = "
"/\/([0-9]+)\//"
";"

正規表現リテラルの部分は正しく取り出せました。
その結果、minify版でも正常動作しました。
ただし、これだと、一行に複数の正規表現パターンがある文字列(複文)

"var regex = /\/([0-9]+)\//;var regex2 = /\/([0-9]+)\//;"

だと、こんなふうに分解されます。

"var regex = "
"/\/([0-9]+)\//;var regex2 = /\/([0-9]+)\//"
";"

この場合もたまたま正しく動きますが、でも、あらゆる文字列パターンで正しく動くとは限りませんよね。

もし、入力されるJavaScriptコードが複文では無く、単文である事が保証されているなら上で示した方式でも良いかもしれませんが、自信はありません。

要するに、「正規表現パターンにマッチする正規表現パターン」を書けば良いと思うのですが、少し調べてみましたが分かりませんでした。


返信引用
わいひら
(@yhira)
メンバーサイト Admin
参加: 2年 前
投稿: 6125
2019年1月19日 23:18  
define('MINIFY_PATTERN_JS', '/[^\n]*/[gimuy]*');

これを

define('MINIFY_PATTERN_JS', '/[^\n]{2,}?/(/)?[gimuy]*');

こうすると、「一行に複数の正規表現パターンがある文字列(複文)」でもうまくいく感じですね。

ただこうしてしまうと、今度は以下のような間が一文字の正規表現を捨ててしまうことになってしまう…。

/a/

難しいですね。

This post was modified 7か月 前 by わいひら

返信引用
わいひら
(@yhira)
メンバーサイト Admin
参加: 2年 前
投稿: 6125
2019年1月19日 23:29  

とりあえず今回、食わず嫌いしないでライブラリを覗いてみたら、URLに関する不具合の部分も発見できました。なんか、「Minify URL(s)」という処理がありました。
この処理の部分をコメントアウトしました。
https://github.com/yhira/cocoon/commit/b7c3f5153e872716d966031d74cacacf520e5b66
これで新バージョンのライブラリでも多分問題ないような気がします。
適用したものがこちら。
https://github.com/yhira/cocoon/archive/master.zip
当サイトに適応してみましたが、今回、前回発見した問題部分は改善されていました。


返信引用
わいひら
(@yhira)
メンバーサイト Admin
参加: 2年 前
投稿: 6125
2019年1月19日 23:45  
define('MINIFY_PATTERN_JS', '/([^\n]{2,}?|\w)/(/)?[gimuy]*');

これだと、こんなタイプでもいけそう。

var regex = /\/([0-9]+)\//;var regex2 = /\/([0-9]+)\//;var regex3 = /a/;

これでだいぶカバーできるかも。
JavaScriptの正規表現はあまり使ったことがないので、確かなことわかりませんが。


返信引用

返信する


許可された最大ファイルサイズ 3MB

 
Share:
スポンサーリンク
わいひらをフォローする
おすすめサーバ

性能も兼ね備えながら安くブログ運営を開始したいのであればここ1択。

◎LiteSpeedを用いた高速サーバー(完全SSD)
◎http/2・QUIC(高速化プロトコル)に対応
◎東京・大阪でリージョン選択が可能
◎プランのアップ・ダウングレードが自由自在
◎同サービス内でドメイン管理が可能
◎転送量が多い
◎毎日無料バックアップ(14日分)
◎復元ポイントを指定して復旧可能(無料)
◎アダルト・出会い系サイト可
◎ドメインとサーバー代のチャージ払いが可能
○サーバ引っ越しオプションあり(有料)
サービス運営期間:1年

1年以上の契約をする場合は、クーポンコード入力でさらに10%割引(※2019/12/31まで)。

クーポンコード:PK4JK4RJ

クーポンの使用方法はこちら

プラン変更で負荷対策が行えるので、ブログ向きのレンタルサーバーです。

◎LiteSpeedを用いた高速サーバー(完全SSD)
◎http/2・QUIC(高速化プロトコル)に対応
◎プランのアップ・ダウングレードが自由自在
◎転送量が多い
◎毎日無料バックアップ(14日分)
◎復元ポイントを指定して復旧可能(無料)
◎アダルト・出会い系サイト可
○サーバ引っ越しオプションあり(有料)
○サーバー料金をチャージ払いが可能
サービス運営期間:3年

安定感抜群のサーバーです。あまり急激なアクセス変動がないアフィリエイトサイトに向いています。

◎nginxを用いた高速サーバー(完全SSD)
◎老舗サーバーなので安定感抜群
◎ディスク容量が多い
◎転送量が多い
◎同サービス内でドメイン管理が可能
○http/2(高速化プロトコル)に対応
○毎日無料バックアップ(14日分)
△DBは7日分だけ無料復旧可能(ファイルは有料)
×プラン変更でCPUのスペックアップができない
×プラン変更しても即時反映されない
×アダルト・出会い系サイト不可
サービス運営期間:16年

とにかく速い。サイトに表示スピードを求めるならココ。

◎nginxを用いた高速サーバー(完全SSD)
◎プランのアップ・ダウングレードが自由自在
◎ディスク容量が多い
◎転送量が多い
○http/2(高速化プロトコル)に対応
○毎日無料バックアップ(14日分)
○DB復旧は無料(ファイルは有料)
○サーバ引っ越しツールあり
○サーバー料金をチャージ払いが可能
△新しいサービスなので運営櫪がまだ短い
サービス運営期間:10ヶ月

格安な値段で始められる高機能サーバーです。
性能も備えつつ最安ならここ。
サイトを続けるうちにアクセスが増えれば、プランのアップグレートで対応可能です。

◎LiteSpeedを用いた高速サーバー(完全SSD)
◎激安プランが用意してある
◎値段あたりのスペックが高い(コスパ良し)
◎サーバ引っ越しオプションあり(無料)
◎アダルト・出会い系サイト可
○http/2(高速化プロトコル)に対応
△プランのアップは可能だがダウンは不可
△毎日自動バックアップ(1日分)
△前日のバックアップからのみ復元できる(無料)
サービス運営期間:3年

Cocoon
  
動作中

ログイン または 登録 してください

タイトルとURLをコピーしました