一案
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);