「メイド・イン・ヘブン」スキン適用中

Cocoonフォーラム

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

何を書き込んだら良いか分からない場合は、以下のテンプレートをコピペしてご利用ください。

不具合・カスタマイズ対象ページのURL:

相談内容:

不具合の発生手順:

解決のために試したこと:

※文字だけでは正しく伝わらない可能性があるため、スクショ画像の添付もお願いします。
※高速化設定をしている場合は無効にしてください。
環境情報:

※↑こちらに「Cocoon設定 → テーマ情報」にある「環境情報」を貼り付けてください。

環境情報の取得方法はこちら。
https://wp-cocoon.com/theme-report/
高速化設定を無効にするにはこちら。
https://wp-cocoon.com/theme-trouble/

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

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

フォーラム質問後、問題等が解決した場合は結果を書き込んでいただけると幸いです。同様の問題で調べている方には、結果が一番気になる部分となります。

正規表現リテラルが特定のパターンを含む...
 
共有:
通知
すべてクリア

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

8 投稿
2 ユーザー
1 Likes
3,911 表示
(@hiromi)
Estimable Member Registered
結合: 6年前
投稿: 81
Topic starter  

こんにちは
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)
Illustrious Member Admin
結合: 6年前
投稿: 16312
 

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

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

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


   
返信引用
(@hiromi)
Estimable Member Registered
結合: 6年前
投稿: 81
Topic starter  

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

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

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


   
わいひら reacted
返信引用
わいひら
(@yhira)
Illustrious Member Admin
結合: 6年前
投稿: 16312
 

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

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


   
返信引用
(@hiromi)
Estimable Member Registered
結合: 6年前
投稿: 81
Topic starter  

こんにちは
少し調べてみたのですが、
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)
Illustrious Member Admin
結合: 6年前
投稿: 16312
 
define('MINIFY_PATTERN_JS', '/[^\n]*/[gimuy]*');

これを

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

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

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

/a/

難しいですね。


   
返信引用
わいひら
(@yhira)
Illustrious Member Admin
結合: 6年前
投稿: 16312
 

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


   
返信引用
わいひら
(@yhira)
Illustrious Member Admin
結合: 6年前
投稿: 16312
 
define('MINIFY_PATTERN_JS', '/([^\n]{2,}?|\w)/(/)?[gimuy]*');

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

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

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


   
返信引用
共有:

問題の解決に至った場合には、トピック冒頭の「解決済み」をクリックしていただけますと幸いです。

また、有用な回答があった場合は返信右下にある「いいね!」もご活用ください。回答者の励みになります。

「いいね!」機能はフォーラム登録者のみが利用できる機能です。

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

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

最近の書き込みはこちら。

詳細なカスタマイズ依頼をするならこちら。

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