PHPでpreg_splitの文字化けを回避しながらテキストを改行ごとに区切ってHTMLメールをつくる

PHPでpreg_splitの文字化けを回避しながらテキストを改行ごとに区切ってHTMLメールをつくる


PHPでPOSTデータのテキストを改行ごとに区切ってpタグでマークアップし、HTMLメールをつくります。
途中ではまった、preg_splitの文字化けを回避する方法も。

php関連記事

関連記事をもっとみる

テキストを改行ごとに区切って、pタグで囲むfunction

php

function html_paragraph($str, $xhtml=true){
  $arr = preg_split("/\R\R+/u", $str, -1, PREG_SPLIT_NO_EMPTY);
  $result = "";
  foreach($arr as $value){
    $value = htmlspecialchars($value, ENT_QUOTES);
    $result .= '<p>' . nl2br($value, $xhtml) . "</p>\n";
  }
  return $result;
}

$strにテキストを指定すると、改行コードごとに区切って配列に格納されます。
そして、それぞれにpタグで囲みます。

preg_splitの第一引数は、正規表現で改行コードを入れています。

PREG_SPLIT_NO_EMPTYで空の配列をつくらない

php

$arr = preg_split("/\R\R+/u", $str, -1, PREG_SPLIT_NO_EMPTY);

preg_splitのフラグで、PREG_SPLIT_NO_EMPTYとしたとき、配列に格納される文字列が空じゃないものだけ抽出できます。

preg_splitで文字化けを回避する記述

php

$arr = preg_split("/\R\R+/", $str, -1, PREG_SPLIT_NO_EMPTY);

preg_splitに指定する、正規表現パターンの後にuがないと文字化けが起こることがあります。ハマったパターンでは、「充」の文字が文字化けしました。

正しいfunctionは、一番最初に記載したものなので、それを利用してもらえば大丈夫です。

URLをaタグに置換する

php

$contents = html_paragraph(h($_POST['contents']));

$pattern = '(https?://[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+)';
$replacement = '<a href="\1">\1</a>';
$contents = mb_ereg_replace($pattern, $replacement, $contents);

正規表現でテキスト内のURLを判別し、aタグでマークアップします。

htmlspecialcharsでデータをエスケープする

php

$contents = h($_POST['contents']);

上のh()はhtmlspecialcharsでデータをエスケープしています。
詳細は下記でどうぞ!

phpのvar_dumpでデバッグ・htmlspecialcharsでエスケープ処理などfunctionまとめ
phpのvar_dumpを見やすくする、おなじみのpreタグで挟むfunctionと、 配列のデータを全て、変数へ格納するfunction、 データをエスケープするhtmlspecialcharsが長いので、より簡単に記述し...

HTMLメール用のマークアップ

$contents .= '
<style type="text/css">
body {
  font-family: "メイリオ","BatangChe","DotumChe","GungsuhChe","MingLiU","Courier","Consolas";
  font-size: 15px;
}
</style>';

HTMLメール用のマークアップが終わったので、メールのフォントなどのcssをstyleタグで記述します。

コメント

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