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

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

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

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

Q&A

解決済

1回答

931閲覧

特定のタグ以外の文字列を置換したい

poteto4401

総合スコア57

PHP

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

0グッド

0クリップ

投稿2019/03/26 04:59

やりたいこと

h2、h3、imgタグ内以外のhogehoge<span>piyopiyo</span>に置換したい

<h2>hogehoge</h2> <h3>hogehoge</h3> <p><strong>hogehoge</strong></p> <span>hogehoge</span> hogehoge <img src="hogehoge" alt="hogehoge">

試したこと

str_replaceだと、当然すべてのタグ内の文字列が置換されてしまいます

str_replace('hogehoge', '<span>piyopiyo</span>", $html文字列);

preg_replace_callback、preg_replaceを使用し、正規表現にマッチした文字列のみに適用させればよい
ことは分かってはいるのですが、ロジックが思いつかないです。

ご教授いただけると幸いです。

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

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

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

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

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

yambejp

2019/03/26 05:59

<p>hogehoge<div>hogehoge</div>hogehoge</p> だったらどうしたいのでしょうか?
poteto4401

2019/03/26 06:20

<p><span>piyopiyo</span><div><span>piyopiyo</span></div><span>piyopiyo</span></p> これに変わってほしいです。 たとえば、php.netのように、本文内に特定の文字列があればclassを付与したいのです。 https://www.php.net/manual/ja/function.preg-replace-callback.php callback  ↓ <code class="parameter">callback</code> よろしくおねがいします。
yambejp

2019/03/26 06:22

なるほど <h3><div>hogehoge</div></h3> のようにh3の中にある場合はhogehogeは変更しないという 認識でよろしいですか?
poteto4401

2019/03/26 06:23

そのとおりです!m(_ _)m
guest

回答1

0

ベストアンサー

一案

PHP

1<?PHP 2$str=<<<eof 3<h2>hogehoge</h2> 4<h3>hogehoge</h3> 5<h2>hogefuga</h2> 6<h3>hogehoge<span>hogehoge</span>hogehoge</h3> 7<h2>fugafuga</h2> 8<p>hogehoge<span>hogehoge</span>hogehoge</p> 9<p><strong>hogehoge</strong></p> 10<span>hogehoge</span> 11hogehoge 12<img src="hogehoge" alt="hogehoge"> 13eof; 14$data=[]; 15$pattern="@<h2>.+?</h2>|<h3>.+?</h3>|<.+?>@mis"; 16while(preg_match($pattern,$str,$matches)){ 17 $str= preg_replace($pattern,"%s",$str,1); 18 $data[]=$matches[0]; 19} 20$str= str_replace("hogehoge","<span>piyopiyo</span>",$str); 21$str= vsprintf($str,$data); 22print $str; 23print_r($data); 24

※一部調整

test

h2,h3に属性を含むもの

PHP

1<?PHP 2$str=<<<eof 3<h2>hogehoge</h2> 4<h3>hogehoge</h3> 5<h2 id="123abc">hogehoge</h2> 6<h3>hogehoge<span>hogehoge</span>hogehoge</h3> 7<h2>fugafuga</h2> 8<p>hogehoge<span>hogehoge</span>hogehoge</p> 9<p><strong>hogehoge</strong></p> 10<span>hogehoge</span> 11hogehoge 12<img src="hogehoge" alt="hogehoge"> 13eof; 14$data=[]; 15$pattern="@<(h[23])(\s\S+?)*>.+?</\1>|<.+?>@mis"; 16while(preg_match($pattern,$str,$matches)){ 17 $str= preg_replace($pattern,"%s",$str,1); 18 $data[]=$matches[0]; 19} 20$str= str_replace("hogehoge","<span>piyopiyo</span>",$str); 21$str= vsprintf($str,$data); 22print $str; 23print_r($data);

提示されたソース分

例示のソースは一部クオートの表示がおかしいですが、それを差し引いても特に問題なさそうです

PHP

1<?PHP 2$str=<<<eof 3<h2 id="123" class="1234">hogehoge</h2> 4<p>hogehoge<strong style="color: rgb(0, 0, 255);">hogehoge</strong>hogehoge</p> 5<p>hogehoge</p><p>hogehoge</p> 6<p><img src="https://hogehoge.png" alt="hogehoge?" height="123" width="123"></p> 7<h2>hogehoge</h2> 8<p>hogehoge</p><p>hogehoge<strong style="color: rgb(0, 0, 255);">hogehoge</strong></p> 9<p>hogehoge</p> 10<h2>hogehoge</h2> 11<p>hogehoge<strong style="color: rgb(0, 0, 255);">hogehoge</strong></p> 12<p>hogehoge</p><p>hogehoge</p><p> 13<img src="https://hogehoge.png" alt="hogehoge" height="111" width="222"></p> 14eof; 15 16$data=[]; 17$pattern="@<(h[23])(\s\S+?)*>.+?</\1>|<.+?>@mis"; 18while(preg_match($pattern,$str,$matches)){ 19 $str= preg_replace($pattern,"%s",$str,1); 20 $data[]=$matches[0]; 21} 22$str= str_replace("hogehoge","<span>piyopiyo</span>",$str); 23$str= vsprintf($str,$data); 24print $str; 25print_r($data);

投稿2019/03/26 07:27

編集2019/03/27 01:40
yambejp

総合スコア114843

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

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

poteto4401

2019/03/26 08:25

vsprintfで%sに対する引数の数が少ないというエラーが起こってしまいます。 元の書式($str)に条件はありますでしょうか?
yambejp

2019/03/26 08:30

vsprintfをコメントアウトし、$strの%sのかずと$dataの要素数を見比べてみてください //$str= vsprintf($str,$data); print $str; print_r($data);
poteto4401

2019/03/26 10:46

おそらく、h2タグにidを振っていたのが原因なようでした。 <h2 id="123abc">hogehoge</h2>
poteto4401

2019/03/26 12:26

置換できる文字列($str)とできない文字列があります。違いを調査しています。
poteto4401

2019/03/26 12:29

できない文字列の場合、%sの数が1つ多いといった状況でした。
yambejp

2019/03/27 00:43

具体的にエラーになるhtml部分を追記ください 「<h2 id="123abc">」には対応しました
poteto4401

2019/03/27 01:22

申し訳ございません、以下になります。 $str=<<<eof <h2 id="123" class="1234">hogehoge</h2> <p>hogehoge<strong style="color: rgb(0, 0, 255);">hogehoge</strong>hogehoge</p> <p>hogehoge</p><p>hogehoge</p> <p><img src="https://hogehoge.png" alt="hogehoge?" height="123" width="123"></p> <h2>hogehoge</h2> <p>hogehoge</p><p>hogehoge<strong style="color: rgb(0, 0, 255);">hogehoge</strong></p> <p>hogehoge</p> <h2>hogehoge</h2> <p>hogehoge<strong style="color: rgb(0, 0, 255);">hogehoge</strong></p> <p>hogehoge</p><p>hogehoge</p><p> <img src="https://hogehoge.png" alt="hogehoge" height="111" width="222"></p> eof;
yambejp

2019/03/27 01:40

見てみたんですが特に問題なさそうなんですけど・・
poteto4401

2019/03/27 01:50

本来の文章に「%」が含まれていることが原因でした・・
poteto4401

2019/03/29 03:09

はじめに%を全角の%に置換することでいけました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問