質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

5回答

2426閲覧

【php】独自ルールの文字列を置換するにはどうしたら良いでしょうか?

hasshy

総合スコア102

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/07/18 20:24

ある文字列から、予め決めておいた独自ルールの文字列を抜き出して置換したいです。
wordpressで言う、ショートコードのような機能を自作したいと考えています。

想定している独自ルールの文字列

文字列は、中括弧{}で囲みます。
実際には、下記の文章のように独自ルールで実装されます。

元の文章

下記のように{}で囲まれた文字を含んだ文字列があります。

{title}

{user}様

この度はありがとうございます。
またのご利用をお待ちしております。

{shop_name}

それぞれ、下記のような文言が入る想定です。

  • title:タイトル
  • shop_name:店名
  • user_name:お客さん名

想定される結果

タイトル

お客さん名様

この度はありがとうございます。
またのご利用をお待ちしております。

店名

実現可能な方法

あまり綺麗な方法ではありませんが、1ルールずつ、置換をしていく方法が考えつきます。

php

1$text = "(前項の文章)"; 2 3str_replace('{title}', 'タイトル', $text); 4str_replace('{shop_name}', '店名', $text); 5str_replace('{user_name}', 'お客さん名', $text); 6 7echo($text); 8

独自ルールの文字列を抽出して、中括弧毎に処理が出来ないものか方法はないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

質問にある「実現可能な方法」を見る限りは、ヒアドキュメントで文章を作成し、変数展開させるだけで良いと思います(特に置換が必要な処理ではないはずです)

複雑な処理(ループや条件分岐)が必要であれば、テンプレートエンジンの採用を検討すると良いです。

どうしても {} を使用した置換をしたいのであれば、正規表現と可変変数を使用することごくシンプルな記述にできると思います。

投稿2019/07/18 23:00

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hasshy

2019/07/19 03:10

何時もありがとうございます。 可変変数は存じ上げておりませんでした。 確かに、可変変数でルール名を定義して、ヒアドキュメントで置換する事は出来そうですね。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2019/07/19 06:16

可変変数の件、ちょっと試してみたけど、きれいな実装にはならないね^^; ${$1}みたいな書き方ができる想定で回答しましたが無理でした。。。 無理やり書いてみたけど、すげぇ汚いw忘れて下さい^^; <?php $html=<<<'eof' {title} {user_name}様 この度はありがとうございます。 またのご利用をお待ちしております。 {dummy} {shop_name} eof; $pattern="/{(.+?)}/"; $html=preg_replace_callback($pattern, function($x){ $title = "タイトル"; $shop_name = "店名"; $user_name = "お客さん名"; return ${$x[1]}??""; },$html); echo $html; ちなみに、可変変数でなくすと yambejp さんの回答と一緒です。
hasshy

2019/07/19 17:11

お忙しい中、コードに書き出していただきありがとうございます! 参考にさせていただきます。
guest

0

ベストアンサー

既に出ている「ヒアドキュメントで文章を作成し、変数展開」や「テンプレートエンジンの活用」が望ましいかなとは思いますが、
正規表現を利用する方法もやってみました。(テンプレートエンジンも内部的には似たような処理をしてると思いますが)

php

1<?php 2$r = ["title"=>"ご注文ありがとうございました","user"=>"山田 太郎","shop_name"=>"オンラインショップタナカ"]; 3 4$body = <<<BODY 5{title} 6 7{user} 様 8 この度はありがとうございます。 9またのご利用をお待ちしております。 10 11{shop_name} 12BODY; 13 14preg_match_all("/\{.+?\}/",$body,$match); 15 16foreach($match[0] as $word){ 17 $rword = str_replace("}","",str_replace("{","",$word)); 18 if(array_key_exists($rword,$r)){ 19 $body = str_replace($word,$r[$rword],$body); 20 } 21} 22echo $body; 23

おそらく、今回$rで表現した内容は実際は入力フォームからやってくることを考えたら、有用かなと。
array_key_exists()でチェックしているので含まれていない項目は置換されないだけです。
もし必須ではない入力項目で、置換されず残る可能性がある場合は別途考慮が必要にはなります。

投稿2019/07/19 00:27

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hasshy

2019/07/19 03:39

何時もありがとうございます。 利用ケースの想定までしていただきありがとうございます。 おっしゃる通り入力フォームの値を想定しておりました。 array_key_existsで存在確認をするところまでご教示頂きありがとうございます。 存じ上げておりませんでしたが、ヒアドキュメントのeofは固定ではなかったのですね。 「>>BODY」が使えるとは知りませんでした。 勉強になりました。
m.ts10806

2019/07/19 03:55

あくまで「ID」です https://www.php.net/manual/ja/language.types.string.php#language.types.string.syntax.heredoc >ある ID (と、それに続けて改行文字) を <<< の後に指定し、文字列を置いた後で、同じ ID を括りを閉じるために置きます つまり、開始と末尾が合っていて、末尾最後に;と改行が入っていれば1文字でも構わないのです。 変数と同じくなるべく意味のあるネーミングをしたほうが良いということですね。
hasshy

2019/07/19 04:11

度々ご教示ありがとうございます。 公式ドキュメントの引用までしていただきありがとうございます。 理解いたしました。
m.ts10806

2019/07/19 04:11

あれ?と思ったらPHPマニュアル確認する癖をつけると良いですよ。 大抵のことはそれで用が済みます
hasshy

2019/07/19 04:24

ご指摘恐れ入ります。
guest

0

preg_replace例2 添字配列の使用を参考にして使ってみるのが良いんではないでしょうか。
中括弧ひとつでは心許ないけど、使うのが自分だけなら注意しながら書くだけなので気にするほどでもないかもしれませんね

投稿2019/07/18 20:50

hentaiman

総合スコア6421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hasshy

2019/07/19 02:59

ご回答頂きありがとうございます。 preg_replaceで、同じ要素数の配列同士を比較して置換する方法があるのですね。 公式ドキュメントのリンクを添付していただきありがとうございます。 > 中括弧ひとつでは心許ないけど、使うのが自分だけなら注意しながら書くだけなので気にするほどでもないかもしれませんね 確かに、純粋な中括弧が使えない可能性がありますね。
guest

0

テンプレ処理をしたいのですよね?
テンプレは外部ファイルを利用することが多いので、ヒアドキュメントで処理できないケースが多いです。

PHP

1<?PHP 2$list=[ 3 "title"=>"タイトル", 4 "shop_name"=>"店名", 5 "user_name"=>"お客さん名", 6 ]; 7$html=<<<'eof' 8 {title} 9 10 {user_name}様 11 この度はありがとうございます。 12 またのご利用をお待ちしております。 13 {dummy} 14 15 {shop_name} 16 17eof; 18$pattern="/{(.+?)}/"; 19$html=preg_replace_callback($pattern,function($x) use($list){ 20 return isset($list[$x[1]])?$list[$x[1]]:""; 21},$html); 22 23print $html;

投稿2019/07/19 00:26

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hasshy

2019/07/19 03:20

何時もありがとうございます。 ソースもご教示いただきありがとうございます。 ご教示いただいた処理のように、ルールも増えていっても対応できる方法を探しておりました。 preg_replace_callbackを使えば、コールバックで置換と条件ができるのですね。 > テンプレは外部ファイルを利用することが多いので、ヒアドキュメントで処理できないケースが多いです。 この処理は、外部ファイルではなくinputで入力された文字列の処理ですので、 こちらの方法で対応できそうです。
yambejp

2019/07/19 03:23

> inputで入力された文字列の処理 それは意味合い的には外部ファイルと同等です inputで入力された文字をpost(get)してもヒアドキュメントに流し込むことはできません
hasshy

2019/07/19 03:34

ご指摘いただきありがとうございます。 なるほどですね。 そうなると純粋に文字列内から要素を探して置換するために、preg_replace(preg_replace_callback)でルールのパターンを検索して、一つ一つ処理をするだけで良いかもしれませんね。
guest

0

メールの定型文に可変文字列(変数)を埋め込みたいとき
http://bashalog.c-brains.jp/18/01/17-110000.php

という記事が参考になると思いました。

投稿2019/07/18 22:41

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hasshy

2019/07/19 03:02

ご回答頂きありがとうございます。 添付していただいた参考ページのような事を実際にやりたいと考えておりました。 参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問