tag:crieit.net,2005:https://crieit.net/tags/%E3%83%90%E3%83%83%E3%83%95%E3%82%A1/feed
「バッファ」の記事 - Crieit
Crieitでタグ「バッファ」に投稿された最近の記事
2021-11-18T00:01:02+09:00
https://crieit.net/tags/%E3%83%90%E3%83%83%E3%83%95%E3%82%A1/feed
tag:crieit.net,2005:PublicArticle/17768
2021-11-18T00:01:02+09:00
2021-11-18T00:01:02+09:00
https://crieit.net/posts/output-var-dump-as-str-20211117
var_dump() の中身を文字列として処理したい
<h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2>
<p><code>var_dump()</code> の出力結果がHTMLを含む文字列のオブジェクトだと仮定します。</p>
<p>そのまま出力されると、当然オブジェクトの中に含まれるHTMLタグがブラウザに認識されてレンダリングされてしまいます。</p>
<p>これでは、元々あったタグや構造とバッティングして表示が崩れてしまう上に、肝心の値の中身を文字列として確認することができません。</p>
<p>……かといって中身がオブジェクトなので <code>htmlspecialchars()</code> もそのままではかけられないですし、オブジェクトの他の値も参照したいので「オブジェクトをループ→全ての項目を出力しつつHTMLが含まれている値のみ <code>htmlspecialchars()</code> で処理する」ということも難しい。</p>
<p>これにどう対処するか、というお話です。</p>
<h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2>
<p>最終的に「一時的にバッファに保存し、文字列となったところで <code>htmlspecialchars()</code> で処理して出力する」という方法に辿り着きました。</p>
<p>サンプルコードとしては以下のような形。</p>
<pre><code class="php"><pre>
<code>
<?php
ob_start();
var_dump($sample_obj);
var_dump($sample_str);
$result = ob_get_clean();
echo htmlspecialchars($result, ENT_QUOTES, 'UTF-8');
?>
</code>
</pre>
</code></pre>
<p><code>pre</code>, <code>code</code>タグ で囲みつつ、 <code>var_dump()</code> の中身を一度バッファに保存するように <code>ob_start()</code> でバッファリングを開始。</p>
<p><code>var_dump()</code> で変数を出力(実際にはバッファに保存)し、一通り出力したい内容をバッファに保存したら <code>ob_get_clean()</code> でバッファを削除しつつバッファの中身を変数に。</p>
<p>残された変数を <code>htmlspecialchars()</code> で処理して出力する、と。</p>
<p>これで問題を解決しました。</p>
<h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://teratail.com/questions/402">PHP - PHP var_dump()の結果をstringにして扱いたい|teratail</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://www.php.net/manual/ja/function.ob-start.php">PHP: ob_start - Manual</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://www.php.net/manual/ja/function.ob-get-clean.php">PHP: ob_get_clean - Manual</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://bayashita.com/p/entry/show/210">var_dump の内容をテキストファイルに出力する方法[PHP] : バヤシタ</a></li>
</ul>
arm-band