「当プラグイン用の商品情報」の「商品レビュー」から、「最適な商品レビューの文字列」を作成する
「当プラグイン用の商品情報」の「商品レビュー」から、「最適な商品レビューの文字列」を作成する処理について、PHPソースコードを解説しています。
「最適な商品レビューの文字列」とは、画面上で読みやすい商品レビュー文章のことです。
「最適な商品レビューの文字列」は、以下の点を満たしています。
- 「商品説明の表示文字数」で切り詰められた文字列であること。
- 「商品説明から削除する文字列」を削除した文字列であること。
- 「商品説明で改行する文字」の前または後ろに、 HTMLの改行タグを追加した文字列であること。
以上の点を満たしている「最適な商品レビューの文字列」は、ブラウザ上で表示された際、ある程度読みやすい文章になっています。
「当プラグイン用の商品情報」の「商品レビュー」から、「最適な商品レビューの文字列」を作成する
// 「ちょうどいい」の単語で「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;
}
}