webcode-labサイトロゴ

  • お問い合わせへのリンクバナー

Webcode Laboratory
for website coding & program & seo;

Topics

この Blog CMS について
「ZeroMail」× PHP7系|エラーの回避方法「数値エンティティの置換(preg_replace関数)」 eyecatch画像

「ZeroMail」× PHP7系|エラーの回避方法「数値エンティティの置換(preg_replace関数)」

rss

「Zeromail」メール送信オープンソーススクリプト


PHPでメール送信の際のバリデーションをしてくれる、
オープンソースのメールフォームスクリプト、「Zeromail」が便利で、以前からしばしば利用させてもらっています。

Zeromailロゴ

配布元サイト:ZeroMail( //zeromail.webtecnote.com/ )


「ZeroMail」はAjaxでのPOST送信が可能で、
「入力チェック・バリデーションメッセージ」等の表示や「送信完了」までを、
ページ遷移なく1ページで完了できるので、とても便利なスクリプトです。
(確認画面・完了画面に遷移させず1ページで完了できるので、コーディングも1ページのみで済む)
 

PHP7にバージョンアップでpreg_replace関数のエラー発生


ただ最近、PHPバージョンを7にし「ZeroMail」を利用したところ、
「zeromail.php」の数値エンティティの置換(preg_replace関数)部分で、エラーが発生しました。
※ 「ZeroMail」バージョンは、 ver1.4.7(最新バージョン)を使用
 

【エラー発生箇所】(PHP)

zeromail.php 807・808行目

/*-----------------------------------------------------
  ver4用デコード
------------------------------------------------------*/
function unhtmlentities($string)
{
    // 数値エンティティの置換 (エラー発生箇所下記2行)
    $string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string); ←ここ
    $string = preg_replace('~&#([0-9]+);~e', 'chr("\\1")', $string); ←ここ
    // 文字エンティティの置換
    $trans_tbl = get_html_translation_table(HTML_ENTITIES);
    $trans_tbl = array_flip($trans_tbl);
    return strtr($string, $trans_tbl);
}
?>


PHP7でpreg_replace関数のe修飾子が廃止されたため、上記でエラーが発生するようです。

 


 

preg_replace関数のe修飾子廃止による「Zeromail」エラーの回避


エラー回避するには、
preg_replace_callback関数を使い、正規表現が必要になります。
詳しい方に質問したり色々と調べて、下記の方法で回避できましたので、参考に掲載します。
 

【エラー回避コード】(PHP)

 上記エラー発生箇所2行分(「数値エンティティの置換」2行部分)を書き換えます。

/*-----------------------------------------------------
  ver4用デコード
------------------------------------------------------*/
function unhtmlentities($string)
{
    // 数値エンティティの置換(修正下記7行)
    $string = preg_replace_callback(
        '/&#(?:x[0-9a-f]++|[0-9]++);/i',
        function ($m) {
            return html_entity_decode($m[0], ENT_QUOTES|ENT_HTML5, 'UTF-8');
        },
        $string
    );
    // 文字エンティティの置換
    $trans_tbl = get_html_translation_table(HTML_ENTITIES);
    $trans_tbl = array_flip($trans_tbl);
    return strtr($string, $trans_tbl);
}
?>
  

ちなみにやっていることは、数値エンティティのみを狙い撃ちにデコードしています。
どなたかのご参考になれば。





 
ページの先頭へ

rss
1件目 (1件中)