「当プラグイン用の商品情報」の「商品レビュー」から、「最適な商品レビューの文字列」を作成する

「当プラグイン用の商品情報」の「商品レビュー」から、「最適な商品レビューの文字列」を作成する処理について、PHPソースコードを解説しています。

「最適な商品レビューの文字列」とは、画面上で読みやすい商品レビュー文章のことです。

「最適な商品レビューの文字列」は、以下の点を満たしています。

  • 「商品説明の表示文字数」で切り詰められた文字列であること。
  • 「商品説明から削除する文字列」を削除した文字列であること。
  • 「商品説明で改行する文字」の前または後ろに、 HTMLの改行タグを追加した文字列であること。

以上の点を満たしている「最適な商品レビューの文字列」は、ブラウザ上で表示された際、ある程度読みやすい文章になっています。

目次
  1. 「当プラグイン用の商品情報」の「商品レビュー」から、「最適な商品レビューの文字列」を作成する
  2. 「商品レビューの行の配列」から、最適な「商品レビューの行の文字列」を作成する
  3. 「商品レビューの文字列」から、「改行を追加した商品レビューの文字列」を作成する
  4. ReviewItemHTMLUtils.phpのソースコード

「当プラグイン用の商品情報」の「商品レビュー」から、「最適な商品レビューの文字列」を作成する

// 「ちょうどいい」の単語で「fit」を選んだ。
public static function makeFitReviewText(
	ReviewItem $reviewItem,
	ReviewItemHTMLOption $reviewItemHTMLOption
) {

	$reviewLength = $reviewItemHTMLOption->getReviewLength();

	$reviewText;

	$reviewLineArray = $reviewItem->getReviewLineArray();
	if (count($reviewLineArray) > 0) {

		$reviewText = ReviewItemHTMLUtils::makeFitReviewLinesText(
			$reviewLineArray,
			$reviewLength
		);
	} else {

		$plainTextReview = $reviewItem->getPlainTextReview();
		// HTML終了タグがないので、文字列を途中で切断できる。平文なので、HTML文法エラーとならない。
		$reviewText = TextUtils::mb_strimwidth($plainTextReview, 0, $reviewLength, "…"); // $reviewLengthは、文字幅(見た目の長さ)を示す。
	}

	$stringToDeleteJSONArray = $reviewItemHTMLOption->getStringToDeleteJSONArray();
	$reviewText = str_replace($stringToDeleteJSONArray, "", $reviewText); // 表示したくない文字列を削除する。

	$stringToBreakJSONArray = $reviewItemHTMLOption->getStringToBreakJSONArray();
	// 文字列の前または後ろに、改行タグを追加する。
	$SENTENCE_SYMBOLS = $reviewItemHTMLOption->getLatestSentenceSymbols();
	$reviewText = ReviewItemHTMLUtils::makeReviewTextWithLineBreakAdded(
		$reviewText,
		$stringToBreakJSONArray,
		$SENTENCE_SYMBOLS
	);

	return $reviewText;
}

makeFitReviewText()関数は、

「当プラグイン用の商品情報」の「商品レビュー」から、「最適な商品レビューの文字列」を作成します。

「当プラグイン用の商品情報」の「商品レビュー」は、makeFitReviewText()関数の$reviewItem引数が保持しています。

ここで言う「最適な商品レビューの文字列」とは、画面上で読みやすい商品レビュー文章のことです。

※「最適」という言葉が「読みやすい」を意味している点について、わかりにくかったと思います。

作成された「最適な商品レビューの文字列」は、以下の点を満たしています。

  • 「商品説明の表示文字数」で切り詰められた文字列であること。
  • 「商品説明から削除する文字列」を削除した文字列であること。
  • 「商品説明で改行する文字」の前または後ろに、 HTMLの改行タグを追加した文字列であること。

以上の点を満たしている「最適な商品レビューの文字列」は、ブラウザ上で表示された際、ある程度読みやすい文章になっています。

作成された「最適な商品レビューの文字列」は、最終的に$reviewText変数に代入されています。

その$reviewText変数は、return文で返されます。

「最適な商品レビューの文字列」の例

当プラグインの「アフィリエイトの設定」、「商品説明」に関する設定が以下の場合において、
「最適な商品レビューの文字列」の例を、示します。

「商品説明」に関する設定「商品説明」に関する設定値
「商品説明の表示文字数」300
「商品説明から削除する文字列」<p>
</p>
全角の「<」「>」文字を用いたpタグ
「商品説明で改行する文字」
当プラグインの「アフィリエイトの設定」、「商品説明」に関する設定

「最適な商品レビューの文字列」の例。

【メール便送料無料、通常24時間以内出荷】著者:山田。<br>
<br>●通常24時間以内に出荷可能です。<br>

中略

※繁忙期やセール等、ご注文数が多い日につきましては 発送まで48時間かかる場合があります…

「商品説明の表示文字数」の300文字で、「商品レビュー」を切り詰める

上記の「最適な商品レビューの文字列」については、約300文字で切り詰められています。

文字列が切り詰められた場合、文字の最後に3点リーダー文字の「…」が追加されます。

「商品レビュー」に、全角の「<」「>」文字を用いたpタグが存在する場合、削除する

上記の「最適な商品レビューの文字列」では、全角の「<」「>」文字を用いたpタグが存在する場合、削除されています。

2018年当時、「当プラグイン用の商品情報」の「商品レビュー」に、以下のような、全角の「<」「>」文字を用いたpタグがありました。

  • 開始タグ<p>文字列
  • 終了タグ</p>文字列

ブラウザ上で<p>文字列、</p>文字列がそのまま表示されていたので、<p>文字列、</p>文字列を削除するようにしました。

“●”文字を、”<br>●”文字列に置換する

上記の「最適な商品レビューの文字列」では、

“●”文字が、
“<br>●”文字列に、置換されています。

「商品レビューのHTML作成」に関する項目を管理する、ReviewItemHTMLOptionクラス

makeFitReviewText()関数の$reviewItemHTMLOption引数は、ReviewItemHTMLOptionクラスの変数です。

ReviewItemHTMLOptionクラスは、「商品レビューのHTML作成」に関する以下の項目を管理するクラスです。

  • 当プラグインの「アフィリエイトの設定」、「商品説明」に関する設定。
  • 商品説明文における「箇条書きの記号文字」、または句点文字。

当プラグインの「アフィリエイトの設定」、「商品説明」に関する設定

当プラグインの「アフィリエイトの設定」、「商品説明」に関する設定には、以下のものがあります。

  • 当プラグインの「アフィリエイトの設定」
    • アマゾンの設定
      • 商品説明の表示文字数
      • 商品説明から削除する文字列のJSON配列
      • 商品説明で改行する文字列のJSONオブジェクト

※関連記事:アフィリエイト商品表示・WordPressプラグイン、アフィリエイトの設定、アマゾンの設定

  • 当プラグインの「アフィリエイトの設定」
    • 楽天の設定
      • 商品説明の表示文字数
      • 商品説明から削除する文字列のJSON配列
      • 商品説明で改行する文字列のJSONオブジェクト

※関連記事:アフィリエイト商品表示・WordPressプラグイン、アフィリエイトの設定、楽天の設定

商品説明文における「箇条書きの記号文字」、または句点文字

商品説明文における「箇条書きの記号文字」、または句点文字は、以下のような文字です。

「箇条書きの記号文字」の例。

●■◆◇★【※・

句点文字は、以下の文字です。

「箇条書きの記号文字」、または句点文字は、

当プラグインの「アフィリエイトの設定」、
「商品説明で改行する文字列のJSONオブジェクト」

ここで設定された文字から、作成されます。

「商品説明で改行する文字列のJSONオブジェクト」の例。

{
"●":"<br>●",
"■":"<br>■",
"◆":"<br>◆",
"◇":"<br>◇",
"★":"<br>★",
"【":"<br>【",
"※":"<br>※",
" ・":"<br> ・",
" サイズ ":"<br> サイズ ",
" 素材 ":"<br> 素材 ",
" 注意事項 ":"<br> 注意事項 ",
"。":"。<br>"
}

「商品説明で改行する文字列のJSONオブジェクト」については、

当記事の「見出し」
当プラグインの「アフィリエイトの設定」、「商品説明」に関する設定
を参照してください。

「当プラグイン用の商品情報」の「商品レビュー」から、「商品説明の表示文字数」で切り詰められた「商品レビューの文字列」を、作成する

// 「ちょうどいい」の単語で「fit」を選んだ。
$reviewLength = $reviewItemHTMLOption->getReviewLength();

$reviewText;

$reviewLineArray = $reviewItem->getReviewLineArray();
if (count($reviewLineArray) > 0) {

	$reviewText = ReviewItemHTMLUtils::makeFitReviewLinesText(
		$reviewLineArray,
		$reviewLength
	);
} else {

	$plainTextReview = $reviewItem->getPlainTextReview();
	// HTML終了タグがないので、文字列を途中で切断できる。平文なので、HTML文法エラーとならない。
	$reviewText = TextUtils::mb_strimwidth($plainTextReview, 0, $reviewLength, "…"); // $reviewLengthは、文字幅(見た目の長さ)を示す。
}

「当プラグイン用の商品情報」の「商品レビュー」から、「商品説明の表示文字数」で切り詰められた「商品レビューの文字列」を、作成します。

$reviewLength変数は、「商品説明の表示文字数」を保持しています。

「商品説明の表示文字数」については、

当記事の「見出し」
当プラグインの「アフィリエイトの設定」、「商品説明」に関する設定
を参照してください。

$reviewItem変数は、「当プラグイン用の商品情報」の「商品レビュー」を保持します。

$reviewItem変数は、以下の「商品レビュー」を保持します。

  • 商品レビューの行の配列
  • 平文の商品レビュー

上記の「商品レビュー」に対して、「商品説明の表示文字数」で切り詰めます。

「商品レビューの行の配列」から、「商品レビューの文字列」を作成する

$reviewLineArray = $reviewItem->getReviewLineArray();
if (count($reviewLineArray) > 0) {

	$reviewText = ReviewItemHTMLUtils::makeFitReviewLinesText(
		$reviewLineArray,
		$reviewLength
	);
}

「商品レビューの行の配列」が存在する場合、

「商品レビューの行の配列」から、
「商品説明の表示文字数」で切り詰められた「商品レビューの文字列」を、作成します。

ReviewItemHTMLUtils::makeFitReviewLinesText()関数を用いて、
「商品説明の表示文字数」で切り詰められた「商品レビューの文字列」を、作成します。

作成された「商品レビューの文字列」を、$reviewText変数に代入します。

ReviewItemHTMLUtils::makeFitReviewLinesText()関数の処理については、

当記事の「見出し」
「商品レビューの行の配列」から、最適な「商品レビューの行の文字列」を作成する
を参照してください。

「平文の商品レビュー」から、「商品レビューの文字列」を作成する

$plainTextReview = $reviewItem->getPlainTextReview();
// HTML終了タグがないので、文字列を途中で切断できる。平文なので、HTML文法エラーとならない。
$reviewText = TextUtils::mb_strimwidth($plainTextReview, 0, $reviewLength, "…"); // $reviewLengthは、文字幅(見た目の長さ)を示す。

「商品レビューの行の配列」が存在しない場合、

「平文の商品レビュー」から、
「商品説明の表示文字数」で切り詰められた「商品レビューの文字列」を、作成します。

$plainTextReview変数に、「平文の商品レビュー」を代入します。

TextUtils::mb_strimwidth()関数を用いて、「商品説明の表示文字数」で切り詰められた「商品レビューの文字列」を、作成します。

$reviewLength変数が保持する「商品説明の表示文字数」で、
$plainTextReview変数が保持する「平文の商品レビュー」を、切り詰めます。

そして、切り詰めた「平文の商品レビュー」の末尾に、
3点リーダー文字の「…」を追加します。

作成された「商品レビューの文字列」を、$reviewText変数に代入します。

「平文の商品レビュー」は平文なので、任意の表示文字数で切り詰めても、HTML文法エラーになりません。

「平文の商品レビュー」は、HTMLタグの開始タグと終了タグを含んでいません。
よって、文字列の切り詰めで終了タグを失い、HTML文法エラーになることはありません。

例えば、
段落を表す<p>商品の説明文その1</p>において、

<p>商品の説明文その…

このように文字列の切り詰めで、終了タグ</p>を失うことはありません。
TextUtils::mb_strimwidth()関数について

TextUtils::mb_strimwidth()関数の引数に、以下の項目を指定します。

  • 第一引数に、文字列
  • 第二引数に、開始位置
  • 第三引数に、切り詰める文字幅
  • 第四引数に、末尾に付ける文字列
$reviewText = TextUtils::mb_strimwidth($plainTextReview, 0, $reviewLength, "…"); // $reviewLengthは、文字幅(見た目の長さ)を示す。

上記の場合、

$plainTextReview変数の最初から$reviewLength変数の文字幅分だけ切り出し、
末尾に”…”を付けて、$reviewText変数に代入しています。

文字幅とは、見た目上の長さです。
全角文字は2文字分、半角文字は1文字分として計算されます。

見た目上の文字幅については、

当記事の「見出し」
ブラウザ上に「表示する文字数」と似ている、mb_strwidth()関数が返す「文字列の幅」
を参照してください。

切り詰められた「商品レビューの文字列」から、不要な文字列を削除した「商品レビューの文字列」を、作成する

$stringToDeleteJSONArray = $reviewItemHTMLOption->getStringToDeleteJSONArray();
$reviewText = str_replace($stringToDeleteJSONArray, "", $reviewText); // 表示したくない文字列を削除する。

切り詰められた「商品レビューの文字列」から、「商品説明から削除する文字列」を削除した「商品レビューの文字列」を、作成します。

$stringToDeleteJSONArray配列変数に、「商品説明から削除する文字列の配列」を代入する

$stringToDeleteJSONArray = $reviewItemHTMLOption->getStringToDeleteJSONArray();

$stringToDeleteJSONArray配列変数に、「商品説明から削除する文字列の配列」を代入します。

「商品説明から削除する文字列の配列」は、「商品説明から削除する文字列のJSON配列」から作成された配列です。

「商品説明から削除する文字列のJSON配列」の例。

["<p>","</p>","<b>","<br>","<br />"]

上記の配列では、全角の山括弧 を使用しているHTMLタグを、「商品説明から削除する文字列」として指定しています。

「商品説明から削除する文字列のJSON配列」については、

当記事の「見出し」
当プラグインの「アフィリエイトの設定」、「商品説明」に関する設定
を参照してください。

切り詰められた「商品レビューの文字列」から、「商品説明から削除する文字列」を削除する

$reviewText = str_replace($stringToDeleteJSONArray, "", $reviewText); // 表示したくない文字列を削除する。

str_replace()関数の引数に指定した$reviewText変数は、切り詰められた「商品レビューの文字列」を保持します。

str_replace()関数を使って、切り詰められた「商品レビューの文字列」から、「商品説明から削除する文字列」を削除します。

str_replace()関数を使って、

$reviewText変数が保持する「商品レビューの文字列」において、
$stringToDeleteJSONArray配列変数が保持する文字列を、全て空文字に置き換えます。

以上の処理により、商品レビューで表示したくない文字列を削除できます。

str_replace()関数の戻り値である、「商品説明から削除する文字列」を削除した「商品レビューの文字列」を、$reviewText変数に代入します。

不要な文字列を削除した「商品レビューの文字列」から、指定通りに改行タグを追加した「商品レビューの文字列」を、作成する

$stringToBreakJSONArray = $reviewItemHTMLOption->getStringToBreakJSONArray();
// 文字列の前または後ろに、改行タグを追加する。
$SENTENCE_SYMBOLS = $reviewItemHTMLOption->getLatestSentenceSymbols();
$reviewText = ReviewItemHTMLUtils::makeReviewTextWithLineBreakAdded(
	$reviewText,
	$stringToBreakJSONArray,
	$SENTENCE_SYMBOLS
);

「商品説明から削除する文字列」を削除した「商品レビューの文字列」から、
「商品説明で改行する文字」の前または後ろに 、HTMLの改行タグを追加します。

以上より、改行タグを追加した「商品レビューの文字列」を、作成します。

$stringToBreakJSONArray配列変数に、「商品説明で改行する文字列の配列」を代入する

$stringToBreakJSONArray = $reviewItemHTMLOption->getStringToBreakJSONArray();

$stringToBreakJSONArray配列変数に、「商品説明で改行する文字列の配列」を代入します。

「商品説明で改行する文字列の配列」を保持する$stringToBreakJSONArray配列変数の例。

array(12)
"●":"<br>●",
"■":"<br>■",
"◆":"<br>◆",
"◇":"<br>◇",
"★":"<br>★",
"【":"<br>【",
"※":"<br>※",
" ・":"<br> ・",
" サイズ ":"<br> サイズ ",
" 素材 ":"<br> 素材 ",
" 注意事項 ":"<br> 注意事項 ",
"。":"。<br>"

「商品説明で改行する文字列の配列」は、「商品説明で改行する文字列のJSONオブジェクト」から作成された配列です。

「商品説明で改行する文字列のJSONオブジェクト」の例。

{
"●":"<br>●",
"■":"<br>■",
"◆":"<br>◆",
"◇":"<br>◇",
"★":"<br>★",
"【":"<br>【",
"※":"<br>※",
" ・":"<br> ・",
" サイズ ":"<br> サイズ ",
" 素材 ":"<br> 素材 ",
" 注意事項 ":"<br> 注意事項 ",
"。":"。<br>"
}

「商品説明で改行する文字列のJSONオブジェクト」については、

当記事の「見出し」
当プラグインの「アフィリエイトの設定」、「商品説明」に関する設定
を参照してください。

$SENTENCE_SYMBOLS変数に、「箇条書きの記号文字」または「句点文字」を代入する

$SENTENCE_SYMBOLS = $reviewItemHTMLOption->getLatestSentenceSymbols();

$SENTENCE_SYMBOLS変数に、「箇条書きの記号文字」または「句点文字」を代入します。

「箇条書きの記号文字」または「句点文字」を保持する$SENTENCE_SYMBOLS変数の例。

●■◆◇★【※。

「箇条書きの記号文字」または「句点文字」は、「商品説明で改行する文字列のJSONオブジェクト」から作成された文字列です。

「商品説明で改行する文字列のJSONオブジェクト」については、

当記事の「見出し」
当プラグインの「アフィリエイトの設定」、「商品説明」に関する設定
を参照してください。

「商品レビューの文字列」から、「改行を追加した商品レビューの文字列」を作成する

$reviewText = ReviewItemHTMLUtils::makeReviewTextWithLineBreakAdded(
	$reviewText,
	$stringToBreakJSONArray,
	$SENTENCE_SYMBOLS
);

不要な文字列を削除した「商品レビューの文字列」から、「改行を追加した商品レビューの文字列」を作成します。

ReviewItemHTMLUtils::makeReviewTextWithLineBreakAdded()関数を用いて、
「改行を追加した商品レビューの文字列」を作成します。

作成した「改行を追加した商品レビューの文字列」を、$reviewText変数に代入します。

ReviewItemHTMLUtils::makeReviewTextWithLineBreakAdded()関数の処理については、

当記事の「見出し」
「商品レビューの文字列」から、「改行を追加した商品レビューの文字列」を作成する
を参照してください。

「商品レビューの行の配列」から、最適な「商品レビューの行の文字列」を作成する

private static function makeFitReviewLinesText($reviewLineArray, $reviewLength)
{

	$fitReviewLinesText = "";
	$BR_TAG = "<br>";

	$lineCount = count($reviewLineArray);
	$lastIndex = $lineCount - 1;

	for ($i = 0; $i < $lineCount; $i++) {

		$fitReviewLinesText .= $reviewLineArray[$i];

		// $BR_TAGを加えた長さで判定する。例:mb_strimwidthの数え間違い例:<br>…… が <br…… という風に切断されていた。
		$stringWidth = mb_strwidth($fitReviewLinesText . $BR_TAG, "UTF-8"); // 文字幅(見た目の長さ) //var_dump($stringWidth);
		if ($stringWidth >= $reviewLength) {

			$fitReviewLinesText = TextUtils::mb_strimwidth(
				$fitReviewLinesText,
				0,
				$reviewLength,
				"…"
			);
			break;
		}

		if ($i < $lastIndex) {
			$fitReviewLinesText .= $BR_TAG;
		}
	}

	return $fitReviewLinesText;
}

最適な「商品レビューの行の文字列」を保持する$fitReviewLinesText変数の例。

商品レビューの行その1<br>商品レビューの行その2<br>商品レビューの…

makeFitReviewLinesText()関数は、

「商品レビューの行の配列」から、最適な「商品レビューの行の文字列」を作成します。

「商品レビューの行の文字列」は、以下の点を満たしているので、最適な「商品レビューの行の文字列」になっています。

  • 「商品説明の表示文字数」で切り詰められた文字列であること。
  • 「商品レビューの行」を示す 「HTMLの改行タグ」が追加された文字列であること。

最適な「商品レビューの行の文字列」は、最終的に$fitReviewLinesText変数に代入されています。

その$fitReviewLinesText変数は、return文で返されます。

for文のループ処理で、最適な「商品レビューの行の文字列」を作成する

for ($i = 0; $i < $lineCount; $i++) {

	$fitReviewLinesText .= $reviewLineArray[$i];

	// $BR_TAGを加えた長さで判定する。例:mb_strimwidthの数え間違い例:<br>…… が <br…… という風に切断されていた。
	$stringWidth = mb_strwidth($fitReviewLinesText . $BR_TAG, "UTF-8"); // 文字幅(見た目の長さ) //var_dump($stringWidth);
	if ($stringWidth >= $reviewLength) {

		$fitReviewLinesText = TextUtils::mb_strimwidth(
			$fitReviewLinesText,
			0,
			$reviewLength,
			"…"
		);
		break;
	}

	if ($i < $lastIndex) {
		$fitReviewLinesText .= $BR_TAG;
	}
}

「商品レビューの行の配列」を保持する$reviewLineArray配列変数の例。

array(3)
0: "商品レビューの行その1"
1: "商品レビューの行その2"
2: "商品レビューの行その3"

「商品レビューの行の配列」に関する for文のループ処理で、最適な「商品レビューの行の文字列」を作成します。

$fitReviewLinesText変数に対して、「商品レビューの行の文字列」を作成していきます。
最終的に、$fitReviewLinesText変数は、最適な「商品レビューの行の文字列」を保持します。

for ($i = 0; $i < $lineCount; $i++) {

	$fitReviewLinesText .= $reviewLineArray[$i];

以下省略

for文のループ処理において、

$reviewLineArray配列変数の要素を順番に取り出して、
$fitReviewLinesText変数に追加していきます。

$reviewLineArray配列変数の要素とは、「商品レビューの行」です。

作成中の「商品レビューの行の文字列」の幅が「商品説明の表示文字数」以上の場合、「商品レビューの行の文字列」の作成を終了する

// $BR_TAGを加えた長さで判定する。例:mb_strimwidthの数え間違い例:<br>…… が <br…… という風に切断されていた。
$stringWidth = mb_strwidth($fitReviewLinesText . $BR_TAG, "UTF-8"); // 文字幅(見た目の長さ) //var_dump($stringWidth);
if ($stringWidth >= $reviewLength) {

	$fitReviewLinesText = TextUtils::mb_strimwidth(
		$fitReviewLinesText,
		0,
		$reviewLength,
		"…"
	);
	break;
}

ループ処理中において、

$fitReviewLinesText変数が保持する「商品レビューの行の文字列」の幅が、「商品説明の表示文字数」以上か、if文で判断します。

mb_strwidth()関数を用いて、

$stringWidth変数に、
「商品レビューの行の文字列」と「改行タグ」を結合した文字列の幅を、代入します。

mb_strwidth()関数で、以下の文字列を結合した文字列の幅(見た目の長さ)を、計算します。

  • $fitReviewLinesText変数が保持する「商品レビューの行の文字列」
  • $BR_TAG変数が保持する改行タグ(”<br>”文字列)

「商品レビューの行の文字列」と「改行タグ」を結合した文字列の例。

// $fitReviewLinesText変数の例。
商品レビューの行その1<br>商品レビューの行その2<br>商品レビューのその3

// $BR_TAG変数の例。
<br>

// 「商品レビューの行の文字列」と「改行タグ」を結合した文字列の例。
商品レビューの行その1<br>商品レビューの行その2<br>商品レビューのその3<br>

mb_strwidth()関数は、第二引数で指定した文字コード(ここではUTF-8)で、文字列の幅を返します。

$reviewLength変数は、「商品説明の表示文字数」を保持しています。

例えば、$reviewLength変数が300という値を保持している場合、
「商品説明の表示文字数」は300という意味になります。

「商品説明の表示文字数」については、

当記事の「見出し」
当プラグインの「アフィリエイトの設定」、「商品説明」に関する設定
を参照してください。

もしも、$stringWidth変数が、$reviewLength変数以上の場合、

TextUtils::mb_strimwidth()関数を用いて、
「商品レビューの行の文字列」を、「商品説明の表示文字数」で切り詰めます。

$fitReviewLinesText変数が保持する「商品レビューの行の文字列」を、
$reviewLength変数が保持する「商品説明の表示文字数」で、切り詰めます。

そして、切り詰めた「商品レビューの行の文字列」の末尾に、
3点リーダー文字の「…」を追加します。

以上のようにして切り詰めた「商品レビューの行の文字列」を、$fitReviewLinesText変数に代入します。

切り詰めた「商品レビューの行の文字列」を保持する$fitReviewLinesText変数の例。

商品レビューの行その1<br>商品レビューの行その2<br>商品レビューの…

その後、break文でfor文のループ処理から抜け出します。

「商品レビューの行の文字列」と「改行タグ」を結合した文字列の幅を使う理由は、”<br>”文字列を切断しないため

「商品レビューの行の文字列」と「改行タグ」を結合した文字列の幅を、「商品説明の表示文字数」と比較しています。

そうする訳は、

「商品レビューの行の文字列」を切り詰める際、
「商品レビューの行の文字列」の最後に追加した<br>文字列を、切断しないためです。

「商品レビューの行の文字列」の最後に追加した<br>文字列が、切断された例。

商品レビューの行その1<br……

例えば、上記の「商品レビューの行の文字列」のように、改行タグ<br>が切断されるのを防ぐためです。

ブラウザ上に「表示する文字数」と似ている、mb_strwidth()関数が返す「文字列の幅」

当プラグインのプログラムでは、
「商品説明の表示文字数」と、mb_strwidth()関数が返す「文字列の幅」を比較して、「商品レビューの行の文字列」を切り詰めています。

この「文字列の幅」は、ブラウザ上に「表示する文字数」と似ている値だと、判断しています。

mb_strwidth()関数は、文字列の幅を取得するためのPHP関数です。

この関数は、半角文字を1、全角文字を2として数えて、文字列の幅を返します。

例えば、’testテスト’という文字列の幅は、10になります。
‘test’の幅は、4です。
‘テスト’の幅は、6です。

mb_strwidth()関数を使う際は、文字列の長さではなく、幅を返すことに注意して使うことになります。

mb_strwidth(文字列, 文字エンコーディング);

引数には、
文字列とオプショナルで文字エンコーディングを、指定できます。

mb_strwidth()関数は、第二引数に文字エンコーディングを指定することもできます。

よく使われる文字エンコーディングには、UTF-8, ASCII, EUC-JP, SJISなどがあります。
指定しない場合は、内部文字エンコーディングを使用します。

なお、文字エンコーディングによって、文字列の幅が変わることがあります。

ちなみに、文字列の文字数を取得するには、mb_strlen()関数を使用することになります。

「商品レビューの行の文字列」に、HTMLの改行タグを追加する

for ($i = 0; $i < $lineCount; $i++) {

中略

	if ($i < $lastIndex) {
		$fitReviewLinesText .= $BR_TAG;
	}
}

$fitReviewLinesText変数が保持する「商品レビューの行の文字列」の幅が、「商品説明の表示文字数」より小さい場合において、

「商品レビューの行の配列」の最後の要素を処理していない場合、
「商品レビューの行の文字列」に、HTMLの改行タグ(<br>文字列)を追加します。

【「商品レビューの行の配列」の最後の要素を処理していない場合】
このような条件を付ける理由は、「商品レビューの行の文字列」の最後に、HTMLの改行タグを追加しないためです。

「商品レビューの行の配列」と「HTML改行タグ」の対応例。

array(3)
0: "商品レビューの行その1" に "<br>" を追加する。
1: "商品レビューの行その2" に "<br>" を追加する。
2: "商品レビューの行その3" 最後の要素なので、"<br>" を追加しない。

「商品レビューの行の配列」に関する for文のループ処理が終了したら、
$fitReviewLinesText変数は、改行タグが追加された「商品レビューの行の文字列」を保持しています。

「商品レビューの文字列」から、「改行を追加した商品レビューの文字列」を作成する

private static function makeReviewTextWithLineBreakAdded($reviewText, $stringToBreakJSONArray, $SENTENCE_SYMBOLS)
{

	$LINE_BREAK_TAG = "<br>";

	$NON_SENTENCE_CHARACTERS_PATTERN;
	// $SENTENCE_SYMBOLSの例:"●■◆★。"「●箇条書き」の記号文字たち、または句点
	if ($SENTENCE_SYMBOLS) {
		$NON_SENTENCE_CHARACTERS_PATTERN = '[^' . $SENTENCE_SYMBOLS . ']+?';
	} else {
		$NON_SENTENCE_CHARACTERS_PATTERN = '.*?';
	}

	$newReviewText = $reviewText;

	foreach ($stringToBreakJSONArray as $stringToBreak => $replaceText) {

		// 例:'/●([^●◆。]+?)/u'
		// 例:●●●の場合、●●<br>●と置き換える。
		// ●の後に、「●」または「◆」または「。」でない文字列。
		// この文字列は、「●箇条書き」の本文、または句点のこと。
		// +? 最短一致。UTF-8でpreg系を使う場合は、パターン修飾子として"u"を指定する。
		$pattern = '/' . $stringToBreak . '(' . $NON_SENTENCE_CHARACTERS_PATTERN . ')/u';

		$replace = $replaceText . '\1'; // 例:<br>●\1。\1は箇条書きの本文。
		$newReviewText = preg_replace($pattern, $replace, $newReviewText);
	}

	if (TextUtils::startsWith($newReviewText, $LINE_BREAK_TAG)) { // 先頭の<br>を取り除く。
		$startIndex = mb_strlen($LINE_BREAK_TAG, "UTF-8");
		$newReviewText = mb_substr($newReviewText, $startIndex, NULL, "UTF-8");
	}

	// 例:'#<br>[\s ]*?<br>#u'
	// ここでは正規表現の区切り文字(デリミタ)を/の代わりに#を使った。
	// 以前スラッシュ文字がある<br />を使って処理していたから。
	// *? 最短一致
	$pattern = '#' . $LINE_BREAK_TAG . '[\s ]*?' . $LINE_BREAK_TAG . '#u';
	// 例:<br>空白文字<br>を<br>に置換する。
	$newReviewText = preg_replace($pattern, $LINE_BREAK_TAG, $newReviewText);

	return $newReviewText;
}

makeReviewTextWithLineBreakAdded()関数は、

「商品レビューの文字列」から、「改行を追加した商品レビューの文字列」を作成します。

$stringToBreakJSONArray配列変数は、「商品説明で改行する文字列の配列」を保持します。

「商品説明で改行する文字列の配列」を保持する$stringToBreakJSONArray配列変数の例。

array(12)
"●":"<br>●",
"■":"<br>■",
"◆":"<br>◆",
"◇":"<br>◇",
"★":"<br>★",
"【":"<br>【",
"※":"<br>※",
" ・":"<br> ・",
" サイズ ":"<br> サイズ ",
" 素材 ":"<br> 素材 ",
" 注意事項 ":"<br> 注意事項 ",
"。":"。<br>"

「商品説明で改行する文字列の配列」が保持する「商品説明で改行する文字列」について、HTMLの改行タグ(<br>文字列)を、追加します。

例えば、

"●"を
"<br>●"に、置換します。

この文字列置換によって、HTMLの改行タグを追加します。

上記の文字列置換によってHTMLの改行タグを追加して作成した、「改行を追加した商品レビューの文字列」は、最終的に、$newReviewText変数に保持されます。

$newReviewText変数が保持する「改行を追加した商品レビューの文字列」の例。

【メール便送料無料、通常24時間以内出荷】著者:山田。<br>
<br>●通常24時間以内に出荷可能です。<br>

中略

※繁忙期やセール等、ご注文数が多い日につきましては 発送まで48時間かかる場合があります…

この$newReviewText変数は、return文によって返されます。

「箇条書きの本文を特定する正規表現」を作成する

$NON_SENTENCE_CHARACTERS_PATTERN;
// $SENTENCE_SYMBOLSの例:"●■◆★。"「●箇条書き」の記号文字たち、または句点
if ($SENTENCE_SYMBOLS) {
	$NON_SENTENCE_CHARACTERS_PATTERN = '[^' . $SENTENCE_SYMBOLS . ']+?';
} else {
	$NON_SENTENCE_CHARACTERS_PATTERN = '.*?';
}

「商品レビューの文字列」において、「箇条書きの本文を特定する正規表現」を作成します。

ここで言う「箇条書きの本文」とは、以下の文字列のことを言います。

  • 「箇条書きの記号文字」でない文字列
  • 「句点文字」でない文字列

例えば、「箇条書きの記号文字」と「句点文字」が以下の場合、

  • 「箇条書きの記号文字」が”●”の場合
  • 「句点文字」が”。”の場合

「商品レビューの文字列」が以下の場合、

●商品の説明文です。

「箇条書きの本文」は、
“商品の説明文です”
という文字列になります。

この場合、「箇条書きの本文を特定する正規表現」は、
“商品の説明文です”
という文字列を特定する正規表現になります。

$SENTENCE_SYMBOLS変数は、「箇条書きの記号文字」または「句点文字」を保持します。

「箇条書きの記号文字」または「句点文字」を保持する$SENTENCE_SYMBOLS変数の例。

●■◆◇★【※。

$SENTENCE_SYMBOLS変数が、例えば上記の文字列を保持する場合、

$NON_SENTENCE_CHARACTERS_PATTERN変数には、
“[^●■◆◇★【※。]+?”
という「箇条書きの本文を特定する正規表現」が代入されます。

これは、「●■◆◇★【※。」以外の文字を最短でマッチする、という意味です。

つまり、「箇条書きの記号文字」や「句点文字」で区切られた、最短でマッチした部分が、「箇条書きの本文」となります。

$SENTENCE_SYMBOLS変数が空文字の場合

$SENTENCE_SYMBOLS変数が空文字の場合は、

「.*?」という最短一致の正規表現を、
$NON_SENTENCE_CHARACTERS_PATTERN変数に代入します。

この場合は、正規表現で「箇条書きの本文」を特定しません。

「商品説明で改行する文字列」を「HTMLの改行タグ付きの文字列」に置換して、「改行を追加した商品レビューの文字列」を作成する

$newReviewText = $reviewText;

foreach ($stringToBreakJSONArray as $stringToBreak => $replaceText) {

	// 例:'/●([^●◆。]+?)/u'
	// 例:●●●の場合、●●<br>●と置き換える。
	// ●の後に、「●」または「◆」または「。」でない文字列。
	// この文字列は、「●箇条書き」の本文、または句点のこと。
	// +? 最短一致。UTF-8でpreg系を使う場合は、パターン修飾子として"u"を指定する。
	$pattern = '/' . $stringToBreak . '(' . $NON_SENTENCE_CHARACTERS_PATTERN . ')/u';

	$replace = $replaceText . '\1'; // 例:<br>●\1。\1は箇条書きの本文。
	$newReviewText = preg_replace($pattern, $replace, $newReviewText);
}

「商品レビューの文字列」において、
「商品説明で改行する文字列」を、「HTMLの改行タグ付きの文字列」に置換します。

この文字列置換の処理によって、「改行を追加した商品レビューの文字列」を作成します。

最初に、「商品レビューの文字列」を、$newReviewText変数に代入します。
今後、$newReviewText変数に対して文字列の置換を行い、HTMLの改行タグを追加していきます。

$stringToBreakJSONArray配列変数は、「商品説明で改行する文字列の配列」を保持します。

「商品説明で改行する文字列の配列」を保持する$stringToBreakJSONArray配列変数の例。

array(12)
"●":"<br>●",
"■":"<br>■",
"◆":"<br>◆",
"◇":"<br>◇",
"★":"<br>★",
"【":"<br>【",
"※":"<br>※",
" ・":"<br> ・",
" サイズ ":"<br> サイズ ",
" 素材 ":"<br> 素材 ",
" 注意事項 ":"<br> 注意事項 ",
"。":"。<br>"

$newReviewText変数が保持する「商品レビューの文字列」が以下の場合、

●商品の説明文その1です。
■商品の説明文その2です。
◆商品の説明文その3です。

$stringToBreakJSONArray配列変数に関するforeach文のループ処理によって、
以下のように文字列置換されます。

「改行を追加した商品レビューの文字列」の例。

<br>●商品の説明文その1です。<br>
<br>■商品の説明文その2です。<br>
<br>◆商品の説明文その3です。<br>

ちなみに、先頭の<br>文字列は、後で実行される処理にて削除されます。

「商品説明で改行する文字列の配列」に関するループ処理

foreach ($stringToBreakJSONArray as $stringToBreak => $replaceText) {
	$pattern = '/' . $stringToBreak . '(' . $NON_SENTENCE_CHARACTERS_PATTERN . ')/u';

	$replace = $replaceText . '\1'; // 例:<br>●\1。\1は箇条書きの本文。
	$newReviewText = preg_replace($pattern, $replace, $newReviewText);
}

$stringToBreakJSONArray配列変数は、「商品説明で改行する文字列の配列」を保持します。
この配列は、商品説明文中の特定の文字列と、それを置き換える文字列を、キーと値として持っています。

foreach文で、$stringToBreakJSONArray配列変数から、キーと値を一つずつ取り出します。

$stringToBreak変数には、改行したい文字が入ります。
例えば、「●」や「。」などです。

$replaceText変数には、その代わりに入れる文字が入ります。
例えば、「<br>●」や「。<br>」などです。

preg_replace()関数で、$stringToBreak変数の文字列を、$replaceText変数の文字列に置換する
$pattern = '/' . $stringToBreak . '(' . $NON_SENTENCE_CHARACTERS_PATTERN . ')/u';
$replace = $replaceText . '\1'; // 例:<br>●\1。\1は箇条書きの本文。

$newReviewText = preg_replace($pattern, $replace, $newReviewText);

次に、preg_replace()関数を使って、
$newReviewText変数の中にある$stringToBreak変数の文字列を、
$replaceText変数の文字列に、置き換えます。

preg_replace()関数は、正規表現を使って文字列を置き換える関数です。

  • 第一引数には、置き換えたい文字列のパターンを正規表現で指定します。
  • 第二引数には、置き換える文字列を指定します。
  • 第三引数には、対象となる文字列を指定します。
第一引数の「置き換えたい文字列の正規表現」の例

ここで、第一引数のパターンとして、以下の例があります。

 例:'/●([^●◆。]+?)/u'

このパターンでは、「/」で囲まれた部分が正規表現です。

$stringToBreak変数が「●」だった場合、「/●([^●◆。]+?)/u」となります。

これは、「●」の後に、「●」でも「◆」でも「。」でもない文字列が続くものを、表します。
「●」でも「◆」でも「。」でもない文字列とは、「箇条書きの本文」です。

「[^●◆。]」は、「●」でも「◆」でも「。」でもない文字を表す否定クラスです。

「+?」は、「1回以上繰り返し」という意味です。
「?」がつくことで、最短一致(最小限の長さ)になります。

「u」は、パターン修飾子と呼ばれるものです。
UTF-8でエンコードされた文字列に対して、正規表現を適用することを示しています。

第一引数の正規表現パターンでは、「箇条書きの本文」を括弧で囲んでグループ化しています。
この括弧で囲んだ部分は、「\1」という特殊な文字で参照できます。

「\1」は、後方参照と呼ばれるものです。
正規表現でグループ化した部分(括弧で囲んだ部分)にマッチした文字列を参照するための記法です。

例えば、「●商品の説明文その1です」という文字列があった場合、
「商品の説明文その1です」という部分が、「\1」になります。

第二引数の「置き換える文字列」

第二引数の置き換える文字列は、$replaceText変数と「\1」を結合しています。

例えば、$replaceText変数が「<br>●」だった場合、
「<br>●\1」となります。

これは例えば、「<br>●商品の説明文その1です」というように置き換えられます。

なお、「●●●」という風に「箇条書きの記号文字」が連続している場合、
「●●<br>●」と置き換えます。

最後尾の「●」だけ、「<br>●」と置換します。

preg_replace()関数によって、「改行を追加した商品レビューの文字列」を作成する

以上のように「商品説明で改行する文字列の配列」に関するループ処理では、

preg_replace()関数によって、
$newReviewText変数の中にある$stringToBreak変数の文字列が、
$replaceText変数の文字列に、置き換えられていきます。

最終的に$newReviewText変数は、「改行を追加した商品レビューの文字列」を保持します。

「改行を追加した商品レビューの文字列」の例。

<br>●商品の説明文その1です。<br>
<br>■商品の説明文その2です。<br>
<br>◆商品の説明文その3です。<br>

「改行を追加した商品レビューの文字列」の先頭の<br>文字列を、取り除く

if (TextUtils::startsWith($newReviewText, $LINE_BREAK_TAG)) { // 先頭の<br>を取り除く。
	$startIndex = mb_strlen($LINE_BREAK_TAG, "UTF-8");
	$newReviewText = mb_substr($newReviewText, $startIndex, NULL, "UTF-8");
}

「HTMLの改行タグ付きの文字列」の先頭に<br>文字列がある場合、
先頭の<br>文字列を取り除きます。

$newReviewText変数は、「改行を追加した商品レビューの文字列」を保持します。

「改行を追加した商品レビューの文字列」の例。

<br>●商品の説明文その1です。<br>
<br>■商品の説明文その2です。<br>
<br>◆商品の説明文その3です。<br>

先頭にある<br>文字列を、取り除きます。

先頭の<br>文字列を取り除いた「改行を追加した商品レビューの文字列」の例。

●商品の説明文その1です。<br>
<br>■商品の説明文その2です。<br>
<br>◆商品の説明文その3です。<br>

最初に、TextUtils::startsWith()関数を使って、
$newReviewText変数が$LINE_BREAK_TAG変数の文字列で始まっているかどうかを、判定します。

$LINE_BREAK_TAG変数は<br>という文字列で、HTMLの改行を表すタグです。
もしも、$newReviewText変数が<br>で始まっていたら、先頭の<br>文字列を取り除きます。

そのために、mb_strlen()関数を使って、$LINE_BREAK_TAG変数の文字数を、UTF-8という文字コードで計算します。
その結果を、$startIndex変数に代入します。

そして、mb_substr()関数を使って、$newReviewText変数の$startIndex番目から最後までの部分文字列を取り出します。

この部分文字列を取り出す処理によって、先頭の<br>文字列を取り除いています。

mb_substr()関数の戻り値を、$newReviewText変数に代入します。

これで$newReviewText変数は、
先頭の<br>文字列を取り除いた「改行を追加した商品レビューの文字列」を、保持します。

「改行を追加した商品レビューの文字列」において、<br>空白文字<br>を<br>に置換する

// 例:'#<br>[\s ]*?<br>#u'
// ここでは正規表現の区切り文字(デリミタ)を/の代わりに#を使った。
// 以前スラッシュ文字がある<br />を使って処理していたから。
// *? 最短一致
$pattern = '#' . $LINE_BREAK_TAG . '[\s ]*?' . $LINE_BREAK_TAG . '#u';
// 例:<br>空白文字<br>を<br>に置換する。
$newReviewText = preg_replace($pattern, $LINE_BREAK_TAG, $newReviewText);

「改行を追加した商品レビューの文字列」において、<br>空白文字<br>を<br>に置換します。

そのように置換する訳は、HTMLにおいて、brタグを連続で使用することは不適切であり避けるべき、と判断したからです。

$pattern変数が保持する正規表現。
'#<br>[\s ]*?<br>#u'

$pattern変数に、正規表現を代入します。
この正規表現では、#を区切り文字として使っています。

$LINE_BREAK_TAG変数は、<br>という改行タグを示す文字列です。

正規表現の中身は、改行タグと空白文字(半角スペースと全角スペース)を表しています。

[\s ]*?
この部分は、空白文字が0個以上あることを意味します。
?は最短一致というオプションで、できるだけ少ない文字数でマッチするようにします。

最後に、preg_replace()関数を使って、

$newReviewText変数が保持する「改行を追加した商品レビューの文字列」の中から、
$pattern変数が保持する正規表現にマッチする部分を、<br>に置き換えます。

<br>空白文字<br>を<br>に置き換える、
つまり、2個の改行タグを1個の改行タグに置き換えます。

この文字列置換によって、brタグの連続使用を修正しています。

ReviewItemHTMLUtils.phpのソースコード

<?php

namespace goodsmemo\item\html;

use goodsmemo\item\ReviewItem;
use goodsmemo\item\html\ReviewItemHTMLOption;
use goodsmemo\text\TextUtils;

require_once GOODS_MEMO_DIR . "item/ReviewItem.php";
require_once GOODS_MEMO_DIR . "item/html/ReviewItemHTMLOption.php";
require_once GOODS_MEMO_DIR . "text/TextUtils.php";

class ReviewItemHTMLUtils
{

	public static function makeFitReviewText(
		ReviewItem $reviewItem,
		ReviewItemHTMLOption $reviewItemHTMLOption
	) {

		// 「ちょうどいい」の単語で「fit」を選んだ。
		$reviewLength = $reviewItemHTMLOption->getReviewLength();

		$reviewText;

		$reviewLineArray = $reviewItem->getReviewLineArray();
		if (count($reviewLineArray) > 0) {

			$reviewText = ReviewItemHTMLUtils::makeFitReviewLinesText(
				$reviewLineArray,
				$reviewLength
			);
		} else {

			$plainTextReview = $reviewItem->getPlainTextReview();
			// HTML終了タグがないので、文字列を途中で切断できる。平文なので、HTML文法エラーとならない。
			$reviewText = TextUtils::mb_strimwidth($plainTextReview, 0, $reviewLength, "…"); // $reviewLengthは、文字幅(見た目の長さ)を示す。
		}

		$stringToDeleteJSONArray = $reviewItemHTMLOption->getStringToDeleteJSONArray();
		$reviewText = str_replace($stringToDeleteJSONArray, "", $reviewText); // 表示したくない文字列を削除する。

		$stringToBreakJSONArray = $reviewItemHTMLOption->getStringToBreakJSONArray();
		// 文字列の前または後ろに、改行タグを追加する。
		$SENTENCE_SYMBOLS = $reviewItemHTMLOption->getLatestSentenceSymbols();
		$reviewText = ReviewItemHTMLUtils::makeReviewTextWithLineBreakAdded(
			$reviewText,
			$stringToBreakJSONArray,
			$SENTENCE_SYMBOLS
		);

		return $reviewText;
	}

	private static function makeFitReviewLinesText($reviewLineArray, $reviewLength)
	{

		$fitReviewLinesText = "";
		$BR_TAG = "<br>";

		$lineCount = count($reviewLineArray);
		$lastIndex = $lineCount - 1;

		for ($i = 0; $i < $lineCount; $i++) {

			$fitReviewLinesText .= $reviewLineArray[$i];

			// $BR_TAGを加えた長さで判定する。例:mb_strimwidthの数え間違い例:<br>…… が <br…… という風に切断されていた。
			$stringWidth = mb_strwidth($fitReviewLinesText . $BR_TAG, "UTF-8"); // 文字幅(見た目の長さ) //var_dump($stringWidth);
			if ($stringWidth >= $reviewLength) {

				$fitReviewLinesText = TextUtils::mb_strimwidth(
					$fitReviewLinesText,
					0,
					$reviewLength,
					"…"
				);
				break;
			}

			if ($i < $lastIndex) {
				$fitReviewLinesText .= $BR_TAG;
			}
		}

		return $fitReviewLinesText;
	}

	private static function makeReviewTextWithLineBreakAdded($reviewText, $stringToBreakJSONArray, $SENTENCE_SYMBOLS)
	{

		$LINE_BREAK_TAG = "<br>";

		$NON_SENTENCE_CHARACTERS_PATTERN;
		// $SENTENCE_SYMBOLSの例:"●■◆★。"「●箇条書き」の記号文字たち、または句点
		if ($SENTENCE_SYMBOLS) {
			$NON_SENTENCE_CHARACTERS_PATTERN = '[^' . $SENTENCE_SYMBOLS . ']+?';
		} else {
			$NON_SENTENCE_CHARACTERS_PATTERN = '.*?';
		}

		$newReviewText = $reviewText;

		foreach ($stringToBreakJSONArray as $stringToBreak => $replaceText) {

			// 例:'/●([^●◆。]+?)/u'
			// 例:●●●の場合、●●<br>●と置き換える。
			// ●の後に、「●」または「◆」または「。」でない文字列。
			// この文字列は、「●箇条書き」の本文、または句点のこと。
			// +? 最短一致。UTF-8でpreg系を使う場合は、パターン修飾子として"u"を指定する。
			$pattern = '/' . $stringToBreak . '(' . $NON_SENTENCE_CHARACTERS_PATTERN . ')/u';

			$replace = $replaceText . '\1'; // 例:<br>●\1。\1は箇条書きの本文。
			$newReviewText = preg_replace($pattern, $replace, $newReviewText);
		}

		if (TextUtils::startsWith($newReviewText, $LINE_BREAK_TAG)) { // 先頭の<br>を取り除く。
			$startIndex = mb_strlen($LINE_BREAK_TAG, "UTF-8");
			$newReviewText = mb_substr($newReviewText, $startIndex, NULL, "UTF-8");
		}

		// 例:'#<br>[\s ]*?<br>#u'
		// ここでは正規表現の区切り文字(デリミタ)を/の代わりに#を使った。
		// 以前スラッシュ文字がある<br />を使って処理していたから。
		// *? 最短一致
		$pattern = '#' . $LINE_BREAK_TAG . '[\s ]*?' . $LINE_BREAK_TAG . '#u';
		// 例:<br>空白文字<br>を<br>に置換する。
		$newReviewText = preg_replace($pattern, $LINE_BREAK_TAG, $newReviewText);

		return $newReviewText;
	}
}