<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PHP | ウダ2Blog</title>
	<atom:link href="https://uda2.com/blog/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>https://uda2.com/blog</link>
	<description>大阪でフリーランスとしてWEB制作している管理人が気になった技術をメモったり、作ったツールの紹介などを綴っているブログです。</description>
	<lastBuildDate>Thu, 13 Nov 2025 10:48:22 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>PDFからコピペした文字が微妙に変になったら</title>
		<link>https://uda2.com/blog/jpnormalizer/</link>
					<comments>https://uda2.com/blog/jpnormalizer/#respond</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Thu, 13 Nov 2025 06:59:41 +0000</pubDate>
				<category><![CDATA[制作日記]]></category>
		<category><![CDATA[Github]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">https://uda2.com/blog/?p=2867</guid>

					<description><![CDATA[<p>PDF内のテキストをコピペすると一部の漢字が「⾯」のように少し小さくひしゃげてしまう事がある。これは康熙部首やCJK部首補助という本来は部首を示す漢字に誤変換（？）されるらしい。過去に書いたUTF-8-MAC（NFD）の</p>
The post <a href="https://uda2.com/blog/jpnormalizer/">PDFからコピペした文字が微妙に変になったら</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>PDF内のテキストをコピペすると一部の漢字が「⾯」のように少し小さくひしゃげてしまう事がある。<br>これは<a href="https://ja.wikipedia.org/wiki/%E5%BA%B7%E7%85%95%E9%83%A8%E9%A6%96" target="_blank" rel="noopener" title="康熙部首">康熙部首</a>や<a href="https://ja.wikipedia.org/wiki/CJK%E9%83%A8%E9%A6%96%E8%A3%9C%E5%8A%A9" target="_blank" rel="noopener" title="">CJK部首補助</a>という本来は部首を示す漢字に誤変換（？）されるらしい。<br>過去に書いた<a href="https://uda2.com/blog/mac_filename/" title="">UTF-8-MAC（NFD）の問題</a>も含めて対策した日本語をノーマライズするライブラリを作ってみました。<br><a href="https://github.com/uda2/jpnormalizer" target="_blank" rel="noopener" title="">https://github.com/uda2/jpnormalizer</a></p>



<span id="more-2867"></span>



<p>いづれも「読め無いわけでは無いからそのままでええやん」って感想の人も多いかもしれないですがWindowsのファイル名にUTF-8-MACを使うと一部のソフトで不都合が起きたりスクリプトで検索の際に別の文字なのでヒットしないという問題が発生しますので、マックユーザー向けにファイルアップロード機能を付けるときやPDFの内容をコピペする可能性の高いフォームでは有用かと思います。</p>



<p>言語はJavascript版とPHP版を用意しています。<br>中味はWikipedia等で情報を集めて置換してるだけですが、最初にテキストに該当箇所が無ければ変換処理をしないので負荷は低いかと思います。</p>



<p>Javascriptの方はnormalizeという関数が用意されていて<br>UTF-8-MAC問題だけなら.normalize(&#8220;NFC&#8221;)、康熙部首も変換したいなら.normalize(&#8220;NFKC&#8221;)と実行すると変換可能でネイティブな分処理的には速いのですが<br>多言語用の不必要な文字も変換されてしまうのに、CJK部首補助が変換されないという<br>濁音半濁音だけでなく全ての言語を正規化するので結果負荷が多めなので自前で用意しています。</p>



<p>PHPの方もNormalizer::normalize()があり、php-intlをインストールするか有効化すると使えるが<br>Javascriptnormalize関数と同様に多言語対応のライブラリで冗長なので自前で変換テーブルを用意して変換しています。</p>



<p>Githubとかいいから使ってみたいって方のためにお試し版も用意してます。<br><a href="https://uda2.com/github/jpnormalizer_sample.php">https://uda2.com/github/jpnormalizer_sample.php</a></p>



<p>※UTF-8-MAC（NFD）の問題はMacのファイルシステムがHFS+からAPFSになってかなり減ってます。<br>※NFCの変換するなら半角→全角も組み込んでも良さそうですがAA（アスキーアート）とかで使うので敢えて入れてません。</p>



<p></p>The post <a href="https://uda2.com/blog/jpnormalizer/">PDFからコピペした文字が微妙に変になったら</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/jpnormalizer/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>URLエンコーディングの違い</title>
		<link>https://uda2.com/blog/urlencodevariation/</link>
					<comments>https://uda2.com/blog/urlencodevariation/#respond</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Mon, 15 Apr 2024 04:54:39 +0000</pubDate>
				<category><![CDATA[制作日記]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://uda2.com/blog/?p=2768</guid>

					<description><![CDATA[<p>URLエンコードはその名の通りURLに使えない文字をエスケープする記述ですが言語や関数によって若干ぶれがあるのですが実際に比較検証した事がなかったのでやってみました。まずURLはURL Standardに定義されていてP</p>
The post <a href="https://uda2.com/blog/urlencodevariation/">URLエンコーディングの違い</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>URLエンコードはその名の通りURLに使えない文字をエスケープする記述ですが言語や関数によって若干ぶれがあるのですが実際に比較検証した事がなかったのでやってみました。<br>まずURLは<a href="https://url.spec.whatwg.org/" target="_blank" rel="noreferrer noopener">URL Standard</a>に定義されていて<br>PHPの世界ではurlencode()とrawurlencode()があってurlencode()は半角スペースを「+」に変換したり「~」も変換したりします。<br>Pythonはurllib.parse.quote()とurllib.parse.quote_plus()があってurllib.parse.quote_plus()は半角スペースを「+」に変換したり「/」も変換したりします。<br>JavaScriptはencodeURI()とencodeURIComponent()があってencodeURIComponentはURI予約語「#$&amp;+,/:;=?@」も変換するという違いがあります。</p>



<span id="more-2768"></span>



<p>差異のある文字をピックアップしたアスキー表を作成しました。（<a href="https://uda2.com/testbox/test_urlencode.php" target="_blank" rel="noopener" title="">全文字コードはコチラ</a>）</p>



<figure class="wp-block-table"><table><thead><tr><th>10進数</th><th>16進数</th><th>実体</th><th>PHP1</th><th>PHP2</th><th>PY1</th><th>PY2</th><th>JS1</th><th>JS2</th></tr></thead><tbody><tr><th>32</th><th>U+0020</th><th></th><td>+</td><td>%20</td><td>+</td><td>%20</td><td>%20</td><td>%20</td></tr><tr><th>33</th><th>U+0021</th><th>!</th><td>%21</td><td>%21</td><td>%21</td><td>%21</td><td>!</td><td>!</td></tr><tr><th>35</th><th>U+0023</th><th>#</th><td>%23</td><td>%23</td><td>%23</td><td>%23</td><td>#</td><td>%23</td></tr><tr><th>36</th><th>U+0024</th><th>$</th><td>%24</td><td>%24</td><td>%24</td><td>%24</td><td>$</td><td>%24</td></tr><tr><th>38</th><th>U+0026</th><th>&amp;</th><td>%26</td><td>%26</td><td>%26</td><td>%26</td><td>&amp;</td><td>%26</td></tr><tr><th>39</th><th>U+0027</th><th>&#8216;</th><td>%27</td><td>%27</td><td>%27</td><td>%27</td><td>&#8216;</td><td>&#8216;</td></tr><tr><th>40</th><th>U+0028</th><th>(</th><td>%28</td><td>%28</td><td>%28</td><td>%28</td><td>(</td><td>(</td></tr><tr><th>41</th><th>U+0029</th><th>)</th><td>%29</td><td>%29</td><td>%29</td><td>%29</td><td>)</td><td>)</td></tr><tr><th>42</th><th>U+002a</th><th>*</th><td>%2A</td><td>%2A</td><td>%2A</td><td>%2A</td><td>*</td><td>*</td></tr><tr><th>43</th><th>U+002b</th><th>+</th><td>%2B</td><td>%2B</td><td>%2B</td><td>%2B</td><td>+</td><td>%2B</td></tr><tr><th>44</th><th>U+002c</th><th>,</th><td>%2C</td><td>%2C</td><td>%2C</td><td>%2C</td><td>,</td><td>%2C</td></tr><tr><th>47</th><th>U+002f</th><th>/</th><td>%2F</td><td>%2F</td><td>%2F</td><td>/</td><td>/</td><td>%2F</td></tr><tr><th>58</th><th>U+003a</th><th>:</th><td>%3A</td><td>%3A</td><td>%3A</td><td>%3A</td><td>:</td><td>%3A</td></tr><tr><th>59</th><th>U+003b</th><th>;</th><td>%3B</td><td>%3B</td><td>%3B</td><td>%3B</td><td>;</td><td>%3B</td></tr><tr><th>61</th><th>U+003d</th><th>=</th><td>%3D</td><td>%3D</td><td>%3D</td><td>%3D</td><td>=</td><td>%3D</td></tr><tr><th>63</th><th>U+003f</th><th>?</th><td>%3F</td><td>%3F</td><td>%3F</td><td>%3F</td><td>?</td><td>%3F</td></tr><tr><th>64</th><th>U+0040</th><th>@</th><td>%40</td><td>%40</td><td>%40</td><td>%40</td><td>@</td><td>%40</td></tr><tr><th>126</th><th>U+007e</th><th>~</th><td>%7E</td><td>~</td><td>~</td><td>~</td><td>~</td><td>~</td></tr></tbody></table><figcaption class="wp-element-caption">PHP1：PHPの関数「urlencode()」<br>PHP2：PHPの関数「rawurlencode()」<br>PY1：Pythonの関数「urllib.parse.quote_plus()」<br>PY2：Pythonの関数「urllib.parse.quote()」<br>JS1：Pythonの関数「encodeURI()」<br>JS2：Pythonの関数「encodeURIComponent()」</figcaption></figure>



<p>デコードは概ね問題無いが「+」を絡めると誤変換が起こる。<br>例えばサーバー側でrawurlencode()やurllib.parse.quote_plus()を使ってエンコードした文字列をブラウザのrawurlencodeでデコードすると誤変換が起こる。<br>なのでサーバーでもクライアントでも使うなら「+」を使わないdecodeURIComponent()・urllib.parse.quote()・rawurldecode()がオススメです。</p>



<p>なお変換するなら<a href="https://tools.uda2.com/urlencode.html" target="_blank" rel="noreferrer noopener">URLエンコードとデコード -UDA TOOL-</a>を用意しております。</p>The post <a href="https://uda2.com/blog/urlencodevariation/">URLエンコーディングの違い</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/urlencodevariation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cookieの有効期限調査</title>
		<link>https://uda2.com/blog/cookie_lifetime/</link>
					<comments>https://uda2.com/blog/cookie_lifetime/#respond</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Tue, 09 Apr 2024 04:52:18 +0000</pubDate>
				<category><![CDATA[制作日記]]></category>
		<category><![CDATA[Cookie]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">https://uda2.com/blog/?p=2759</guid>

					<description><![CDATA[<p>EUのGDPR（一般データ保護規則）とかカリフォルニアのCCPA（消費者プライバシー法）が策定されても当時は海外の話しだしサードパーティ系の話しはマーケッターじゃないので直接的な影響は無かったのですが、Appleがファー</p>
The post <a href="https://uda2.com/blog/cookie_lifetime/">Cookieの有効期限調査</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>EUのGDPR（一般データ保護規則）とかカリフォルニアのCCPA（消費者プライバシー法）が策定されても当時は海外の話しだしサードパーティ系の話しはマーケッターじゃないので直接的な影響は無かったのですが、AppleがファーストパーティーCookieに制限がかかったITP2.1（Intelligent Tracking Prevention）をwebkitに実装してからはWEB制作にも影響が出てきました。<br>数年前ならいざ知らず、レンダリングエンジンはBlink一強の現状でITPに合わせる必要無さそうですが、それはPCの話しでスマホのシェアの大きいiPhoneのSafariを無視することは出来ずITPに従わざるを得ない状況です。（WEBもアプリもしてるGoogleはWEBに先進な技術を採用してますがAppleはアプリのみなので個人情報を盾にWeb技術には後進的です。）</p>



<p>サードパーティは切り捨てるしか無いけどクッキーは一週間あるからまあいいかと思ってたら、一部のブログ等でITP2.2からクッキーの有効期限が1日になったという記事を散見したので調査することにしました。</p>



<span id="more-2759"></span>



<p>公式の文章を辞書を見ながら確認したところトラッキングの為に他のサイトにデータを送ったりしてる場合は1日なだけでそれ以外はITP2.1から変更無し（1週間）のままのようでした。<br><a href="https://webkit.org/blog/8828/intelligent-tracking-prevention-2-2/" target="_blank" rel="noopener" title="">https://webkit.org/blog/8828/intelligent-tracking-prevention-2-2/</a></p>



<p><a href="https://webkit.org/blog/9521/intelligent-tracking-prevention-2-3/" target="_blank" rel="noreferrer noopener">ITP2.3</a>からlocalstrageに7日の制限がかかってるのも実際試した事はないし、サーバーサイドで保存されたクッキーは規制がかからないとかいう噂も聞くのでこれらを実験してみました。</p>



<p><a href="https://uda2.com/testbox/ipt/" target="_blank" rel="noreferrer noopener">クッキーやセッションやlocalstrageやindexDBの保存期間チェック</a></p>



<p>JavascriptのファーストパーティクッキーもlocalstrageもindexDBも実際は一週間で消えることは無かったですが一ヶ月ほど放置したら消えてました。localstrageの仕様的にはアクションがあったら保持期間が伸びるようなので検証の際にリロードしたのをアクションとして保存期間が伸びたのかと思われます。<br>一方、サーバーサイドクッキーは一ヶ月経っても残ってましたが三ヶ月ほど放置したら消えてました。<br>サーバーを再起動したら消えるとの書き込みを見たのでサーバーソフトの再起動してみたが消えることは無かったしサーバーOSごと再起動しても消えなかったのでサーバーサイドクッキーが消えた原因が時間的なものか別の要因があるのかは分からないけど永遠に保持されるという訳では無いようだ。</p>



<p>数年前には「ブラウザに長く情報を残したいときはクッキーでは無くlocalstorageを使ってね」みたいな流れでしたが諸条件にもよりますが現時点ではlocalstorageよりサーバーサイドのクッキーの方が長く情報を保持できる可能性が高いです。</p>



<p>※アイキャッチ画像は<a href="https://www.photo-ac.com/main/detail/23976149" target="_blank" rel="noreferrer noopener">クッキーとコーヒー &#8211; No: 23976149</a>を使っています。</p>The post <a href="https://uda2.com/blog/cookie_lifetime/">Cookieの有効期限調査</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/cookie_lifetime/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Dropboxを使ったメモ系WEBアプリ「memotion」</title>
		<link>https://uda2.com/blog/memotion/</link>
					<comments>https://uda2.com/blog/memotion/#respond</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Sun, 23 Apr 2023 17:38:36 +0000</pubDate>
				<category><![CDATA[制作日記]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Dropbox]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">https://uda2.com/blog/?p=2604</guid>

					<description><![CDATA[<p>去年ぐらいから意識高い系の人に人気が出てるNotionとか言うメモサービス（最近Notion AIでも話題になってますね）がありますが、おじさんには手元にファイルが無いメモサービスはなじめず、ずっとDropboxにぐだぐ</p>
The post <a href="https://uda2.com/blog/memotion/">Dropboxを使ったメモ系WEBアプリ「memotion」</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>去年ぐらいから意識高い系の人に人気が出てる<a href="https://www.notion.so/ja-jp/product" target="_blank" rel="noopener nofollow" title="Notion">Notion</a>とか言うメモサービス（最近Notion AIでも話題になってますね）がありますが、おじさんには手元にファイルが無いメモサービスはなじめず、ずっと<a href="https://www.dropbox.com/" target="_blank" rel="noopener nofollow" title="">Dropbox</a>にぐだぐだなフォルダ管理で普通にメモをテキスト保存しておりました。<br>Notionの特徴的な自由でリッチなドキュメント制作は欲してなかったのですが<strong>タグ管理</strong>できるのが羨ましく思い、Dropboxでもいい感じにタグ管理できるWEBアプリを作りました。</p>



<p><a href="https://tenhp.com/memotion/" target="_blank" rel="noopener nofollow" title="">https://tenhp.com/memotion/</a></p>



<span id="more-2604"></span>



<p>今回制作に使ったDropboxのAPIはリファレンスは英語のみで以外と国内の解説が少なく今までなら翻訳サイトと行き来がとてもしんどかったのですが<a href="https://openai.com/blog/chatgpt" target="_blank" rel="noopener nofollow" title="">chatGPT</a>がとても役立ちました。今後は日本では人気がないAPIやフレームワークも簡単に使えそうです。</p>



<p>以前作ってたDropboxを使ったタスク管理のWEBアプリ「<a href="https://tenhp.com/task4box/" target="_blank" rel="noopener nofollow" title="">TASK4BOX</a>」はDropboxのAPIがv1の際に公式のPHP SDKを利用して作っていたのですがDropboxのAPIがv2になった際に公式のPHP版SDKが公開されなくなったので復活に結構な工数がかかってしまうことから断念していました。<br>それを受けて元々自分用に作り始めてたmemotionをTASK4BOXの代わりに使って頂けるようにと一般公開する事にしました。</p>



<p>タグの管理はフォルダの管理と違って複数のタグが適用できるので先に「仕事」とかのフォルダに入れてしまうとメモが埋もれて仕舞いがちでしたが複数のタグを付けると「仕事」でもあり「INBOX」（作業中的なタグ）のような分類が可能になり目に触れる可能性が増えました。<br>Reiさんの「<a href="https://www.youtube.com/watch?v=cCK_hGfi2cY" target="_blank" rel="noopener nofollow" title="">メモを極めたエンジニア（弟）の&#8221;Notionの中身&#8221;が凄いので紹介させて下さい。</a>」がわかりやすいです。</p>



<p>記述方法は元々エディタの設定でタイトルとかは色分けしたりしていたのですがブラウザで編集するにあたりMarkDownを採用しました。MarkDownなら普通に書いてもそれなりに表示出来るのでメモからにちょっと装飾するには都合がいいです。自前で実装するのは面倒なので<a href="https://marked.js.org/" target="_blank" rel="noopener nofollow" title="">Marked</a>というのを少しいじって実装しました。</p>



<p>他にもvue.jsをベースにしたりアイコンは<a href="https://fontawesome.com/" target="_blank" rel="noopener nofollow" title="">fontawesome</a>を使ったりして工数を減らしたつもりですが自分の使い勝手をよくするための一括変換できるようにしたりショートカットを入れたリンクボックスを作ったりブックマークレットを作ったりと小さな修正が以外と多く2週間ほどかかりましたがchatGPTが無かったらと思うとぞっとします。</p>The post <a href="https://uda2.com/blog/memotion/">Dropboxを使ったメモ系WEBアプリ「memotion」</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/memotion/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>FILTER_SANITIZE_STRINGはダメです。</title>
		<link>https://uda2.com/blog/php81/</link>
					<comments>https://uda2.com/blog/php81/#respond</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Sat, 23 Jul 2022 11:34:00 +0000</pubDate>
				<category><![CDATA[制作日記]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">https://uda2.com/blog/?p=2536</guid>

					<description><![CDATA[<p>PHP8.1になってから「FILTER_SANITIZE_STRING」は非推奨になりました。 「FILTER_SANITIZE_STRING」はfilter_inputやfilter_varで利用するフィルターの一つで</p>
The post <a href="https://uda2.com/blog/php81/">FILTER_SANITIZE_STRINGはダメです。</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>PHP8.1になってから「FILTER_SANITIZE_STRING」は非推奨になりました。</p>



<p>「FILTER_SANITIZE_STRING」はfilter_inputやfilter_varで利用するフィルターの一つです。<br>特に「FILTER_SANITIZE_STRING」を多様してた訳では何ですがその名前から「文字を無害化」するというイメージで簡易的に処理したいときには使っていました。<br>非推奨の知らせを受けて改めて調べてみました。</p>



<span id="more-2536"></span>



<p>公式の解説「<a href="https://www.php.net/manual/ja/filter.filters.sanitize.php" target="_blank" rel="noopener">PHP: 除去フィルタ &#8211; Manual</a>」によるとFILTER_SANITIZE_STRINGは下記の様になってます。</p>
<blockquote style="margin:0.5em 0 1.5em 1.5em;color: #6EAF2D;">タグと、エンコードされたシングルクォート、ダブルクォートを取り除きます。 オプションで、 特殊文字を取り除いたりエンコードしたりします。 クォートをエンコードする動作は、 FILTER_FLAG_NO_ENCODE_QUOTES を設定することで無効に出来ます。</blockquote>



<p>削除の知らせを受けて調べてみたら「100 &gt; &lt;p&gt;&#8221;テスト&#8221;&lt;/p&gt; &lt; 100」みたいな文字は「100 &gt; &amp;#34;テスト&amp;#34; 」と微妙にな結果です。<br>
HTMLの閉じタグはそのままですし、ダブルクォートは消えずにHTMLエンティティされてますし、右側が消えてしまってます。</p>



<p>私が公式の文章を見て想像したのはstrip_tagsでタグを除去してタグの記号やシングルクォート、ダブルクォートが消えた状態です。</p>



<p>私の想像したフィルター処理を書いて見ました。</p>



<pre><code>$sample = filter_input(INPUT_POST, "sample", FILTER_DEFAULT);
if ($sample !== null &amp;&amp; $sample !== false) {
  $sample = filter_var($sample, FILTER_DEFAULT, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_BACKTICK);
  $sample = str_replace(array('"', "'", "&lt;", "&gt;"), "", strip_tags($sample));
  echo htmlspecialchars($sample, ENT_QUOTES, "UTF-8"));
}</code></pre>



<p>時と場合によりますがfilter_inputではチェックせずにfilter_varでチェックさせる事が多いです。<br>多少冗長ですが2つに分ける事で数字入力の際に全角数字を入力してしまう方の為に前もって半角数値に変換した後でバリデーションを掛けたりできたりします。<br>オプションは<br>FILTER_FLAG_STRIP_LOWはASCIIコードが32未満の文字が除去されます。改行やタブが必要な場合は前処理でエスケープする必要があります。<br>FILTER_FLAG_STRIP_HIGHはASCIIコードが127より大きいの文字が除去されます。マルチバイト文字を除去したい時に使用します。<br>FILTER_FLAG_STRIP_BACKTICKはバッククォート文字を除去します。</p>



<p>HTMLエンティティするならFILTER_SANITIZE_SPECIAL_CHARSというのがありますがコチラは8.1でも利用できます。<br>ただhtmlspecialcharsは「&amp;quot; &amp;gt; &amp;lt;」と文字式ですがFILTER_SANITIZE_SPECIAL_CHARSは「&amp;#34; &amp;#62; &amp;#60;」と数字式なので戻す際には注意が必要です。</p>The post <a href="https://uda2.com/blog/php81/">FILTER_SANITIZE_STRINGはダメです。</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/php81/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>文字コードで気をつけること</title>
		<link>https://uda2.com/blog/multibyte/</link>
					<comments>https://uda2.com/blog/multibyte/#respond</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Wed, 06 May 2015 13:05:54 +0000</pubDate>
				<category><![CDATA[制作日記]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SJIS]]></category>
		<category><![CDATA[UTF-8]]></category>
		<category><![CDATA[文字コード]]></category>
		<guid isPermaLink="false">http://uda2.com/blog/?p=1941</guid>

					<description><![CDATA[<p>よく「JIS（ISO-2022-JP）」と表現されますが、PHPでは「ISO-2022-JP」と「JIS」は違う文字コードになります。 「ISO-2022-JP」はメールでよく使われる文字コードで規格を厳守してるので機種</p>
The post <a href="https://uda2.com/blog/multibyte/">文字コードで気をつけること</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>よく「JIS（ISO-2022-JP）」と表現されますが、PHPでは「ISO-2022-JP」と「JIS」は違う文字コードになります。<br />
「ISO-2022-JP」はメールでよく使われる文字コードで規格を厳守してるので機種依存文字（ISO-2022-JP規定外文字）や半角カナ共に扱えません。<br />
一方「JIS」は半角カナが使え、機種依存文字が扱えない。<br />
八方ふさがりのように見えるがPHP5.2.1からは「ISO-2022-JP-MS」が用意されており、コレだと機種依存文字も半角カナも扱える。<br />
「メールはJISだから機種依存文字や半角カナが送信出来ない」はずだが、ISO-2022-JPのふりして中身をISO-2022-JP-MSにすると機種依存文字が送れたりします。（受け手のメールソフトが対応してた場合のみですが・・・）<br />
<span id="more-1941"></span><br />
このように元の規格を拡張したものは他にも多くあり、有名な所で<br />
「SJIS」と「SJIS-win」<br />
「EUC-JP」と「eucJP-win」と「CP51932」<br />
といったものがある。</p>
<p>SJISだと「¥」(0x5C) を検索すると「表」(0x95 0x5C) にマッチしてしまったり<br />
EUC-JPだと「海」(0xB3 0xA4) を検索すると「ここ」(0xA4 0xB3 0xA4 0xB3) にマッチしてしまったりする。<br />
そのため低速なマルチバイトに対応した関数（mb_）を利用する必要があった。<br />
それがUTF-8が全盛の時代になって文字コード問題に対して配慮する必要が減ったが無くなった訳では無い。</p>
<h4>BOM問題</h4>
<p>文章ファイルを保存時にBOM（Byte Order Mark）と呼ばれる「0xEF 0xBB 0xBF」の3バイト文字を付けるか付けないかで、BOMありを「UTF-8」としBOMなしを「UTF-8N」と呼んだりする。Linux系のスクリプト（PHP等）ではファイルの先頭の文字にBOMがあると正常に動かないし逆にMicrosoft製のソフトではBOMが無いと正常に動かない。</p>
<h4>&#12316; （波ダッシュ）問題</h4>
<p><a href="http://ja.wikipedia.org/wiki/%E6%B3%A2%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5" target="_blank">波ダッシュ &#8211; Wikipedia</a>に詳しく書かれてるが古いWindowsのアプリで編集すると〜が消えてしまう。</p>
<h4>UTF-8 4バイト問題</h4>
<p>UTF-8に対応してると言ってもソフトによっては3バイトまでしか対応していなかったりする。<br />
例えば「辰&#134071;&#131083;一郎」の&#134071;（吉）と&#131083;（丈）といった4バイト文字を扱おうとすると、個人的に愛用してる「Mery」も少し前のバージョンは表示できなかったし、人気DB「MySQL」もちょっと前まで未対応だった。MySQLの場合は<a href="http://dev.classmethod.jp/cloud/aws/utf8mb4-on-rds-mysql/" target="_blank">RDS MySQL5.5.33 で『utf8mb4』(4バイト対応UTF-8文字コードセット)を試してみた</a>を試してみたの通りすると対応出来るらしい。MySQLのバージョンや設定が変えられない場合は該当文字を実体参照にして格納する方法もあります。</p>The post <a href="https://uda2.com/blog/multibyte/">文字コードで気をつけること</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/multibyte/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>simplexml_load_fileとsimplexml_load_stringの速度比較</title>
		<link>https://uda2.com/blog/simplexml_load_file_string/</link>
					<comments>https://uda2.com/blog/simplexml_load_file_string/#respond</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Mon, 04 May 2015 18:34:29 +0000</pubDate>
				<category><![CDATA[制作日記]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ベンチ]]></category>
		<guid isPermaLink="false">http://uda2.com/blog/?p=1935</guid>

					<description><![CDATA[<p>外部サイトのRSSを読む処理をする際に専用の関数simplexml_load_fileを使っていた。 混雑するサイトを考慮してタイムアウト時間、待機時間、再試行回数を含めた関数を作った。 function h_simpl</p>
The post <a href="https://uda2.com/blog/simplexml_load_file_string/">simplexml_load_fileとsimplexml_load_stringの速度比較</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>外部サイトのRSSを読む処理をする際に専用の関数simplexml_load_fileを使っていた。<br />
混雑するサイトを考慮してタイムアウト時間、待機時間、再試行回数を含めた関数を作った。<br />
<span id="more-1935"></span></p>
<pre><code>function h_simplexml_load_file($url,$timeout=3,$delay=1,$repeat=5) {
	ini_set('default_socket_timeout',$timeout);
	for ($i = 0; !($rss = @simplexml_load_file($url)) && $i &lt; $repeat; ++$i) {
		sleep($delay);
		if ($i == $repeat-1) {
			return false;
		}
	}
	return $rss;
}</code></pre>
<p>ふと、simplexml_load_fileとfile_get_contentsしてからsimplexml_load_stringするのってどっちが早いのだろうと考え試してみた。</p>
<pre><code>function h_simplexml_load_file2($url,$timeout=3,$delay=1,$repeat=5) {
	if (!($buffer = h_file_get_contents($url,$timeout,$delay,$repeat))) return false;
	if (!($rss = @simplexml_load_string($buffer))) return false;
	return $rss;
}
function h_file_get_contents($url,$timeout=3,$delay=1,$repeat=5) {
	ini_set('default_socket_timeout',$timeout);
	for ($i = 0; !($rss = @file_get_contents($url)) && $i &lt; $repeat; ++$i) {
		sleep($delay);
		if ($i == $repeat-1) {
			return false;
		}
	}
	return $rss;
}</code></pre>
<p>適当に某人気アイドルグループのブログ52サイトで調査してみた。</p>
<p>h_simplexml_load_file（simplexml_load_file）<br />
1回目：44.2637<br />
2回目：44.1838<br />
3回目：44.4204</p>
<p>h_simplexml_load_file2（file_get_contentsしてからsimplexml_load_string）<br />
1回目：38.863<br />
2回目：38.7857<br />
3回目：39.8881</p>
<p>意外な事にfile_get_contentsしてからsimplexml_load_stringの方が早かった。</p>The post <a href="https://uda2.com/blog/simplexml_load_file_string/">simplexml_load_fileとsimplexml_load_stringの速度比較</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/simplexml_load_file_string/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>コンストラクタで多言語化を</title>
		<link>https://uda2.com/blog/multilingual/</link>
					<comments>https://uda2.com/blog/multilingual/#respond</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Sun, 03 May 2015 12:33:19 +0000</pubDate>
				<category><![CDATA[制作日記]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[クラス]]></category>
		<category><![CDATA[コンストラクタ]]></category>
		<category><![CDATA[多言語化]]></category>
		<guid isPermaLink="false">http://uda2.com/blog/?p=1926</guid>

					<description><![CDATA[<p>PHPなどのシステムで多言語に対応する際は出力の度に言語で分岐して出力するより、言語ファイルを用意した方が効率的です。 言語ファイルと言えばプログラム業界では「.po」「.mo」といったファイルがよく見られます。（はてな</p>
The post <a href="https://uda2.com/blog/multilingual/">コンストラクタで多言語化を</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>PHPなどのシステムで多言語に対応する際は出力の度に言語で分岐して出力するより、言語ファイルを用意した方が効率的です。</p>
<p>言語ファイルと言えばプログラム業界では「.po」「.mo」といったファイルがよく見られます。（<a href="http://wakaba.github.io/packages/slides/20130423-i18n.html" target="_blank">はてなの場合</a>）<br />
これらの言語ファイルをPHPで使うには下記の流れの作業する事になります。</p>
<p>1. 翻訳元の「.pot」ファイルを作成<br />
2. ファイルを元に翻訳元と翻訳後の書かれた「.po」ファイルを作成<br />
3. 「.po」ファイルを「.mo」ファイルにバイナリ変換<br />
4. <a href="http://php.net/manual/ja/book.gettext.php" target="_blank">GetText</a>というライブラリで翻訳させる。</p>
<p>大規模なシステムだと分業しやすいというメリットはありますが「TASK4BOX」みたいな規模の小さいシステムだと大袈裟なので自前で言語ファイルを作る事にした。<br />
<span id="more-1926"></span><br />
翻訳文が数個なら個数分の定数（define）を設定する事も考えたが、個数が多いのでまとめたい。<br />
そこでコンストラクタ（クラス）で言語ファイルを用意するようにした。</p>
<pre><code>class language {
	const HELLO  = "こんにちは";
}</code></pre>
<p>本体の方から呼び出す場所はグローバルだけで無く関数内で使用する事も想定されるので、下記のような感じで組んでみた。</p>
<pre><code>echo "グローバル：".language::HELLO;
function test(){
	echo "関数内：".language::HELLO;
}
test();</code></pre>
<p>ただこの方法だと変数では無いのでヒアドキュメント（&lt;&lt;&lt;）で{language::HELLO}としても展開されない。<br />
そこで、読み込み用に右から左へ受け流す関数（moody）を用意し、関数内で関数名を変数化（$moody）したものを用意し、変数化した関数を通して展開させた。</p>
<pre><code>function moody($val){return $val;}
function test2(){
	$moody = 'moody';
	print &lt;&lt;&lt;EOF
<p>{$moody(language::HELLO)}</p>
EOF;
}
test2();</code></pre>The post <a href="https://uda2.com/blog/multilingual/">コンストラクタで多言語化を</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/multilingual/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>iPhoneに元号アイコン</title>
		<link>https://uda2.com/blog/gengo_icon/</link>
					<comments>https://uda2.com/blog/gengo_icon/#respond</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Sat, 20 Dec 2014 15:15:37 +0000</pubDate>
				<category><![CDATA[制作日記]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[GD]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[元号]]></category>
		<category><![CDATA[年号]]></category>
		<guid isPermaLink="false">http://uda2.com/blog/?p=1592</guid>

					<description><![CDATA[<p>WEBは西暦表記が多いですが書類を書いたりする際には未だ元号（年号）で記入する事が多々あります。 Siriに「今年は平成何年？」と聞いたらも答えてくれますが恥ずかしいです。 IT4コマ漫画：今って平成何年だっけ？ &#8</p>
The post <a href="https://uda2.com/blog/gengo_icon/">iPhoneに元号アイコン</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p><a href="http://gengo.uda2.com/" target="_blank"><img fetchpriority="high" decoding="async" src="http://gengo.uda2.com/icon2014.png" alt="元号アイコン" width="240" height="240" class="aligncenter size-medium" style="border-radius: 50px;" /></a><br />
WEBは西暦表記が多いですが書類を書いたりする際には未だ元号（年号）で記入する事が多々あります。<br />
Siriに「今年は平成何年？」と聞いたらも答えてくれますが恥ずかしいです。<br />
<a href="http://www.itmedia.co.jp/news/articles/1412/19/news027.html" target="_blank">IT4コマ漫画：今って平成何年だっけ？ &#8211; ITmedia ニュース</a><br />
によるとそういうアプリがあるとの事ですが年号がバッジ（右上の数字）で表現されていて見た目が微妙です。<br />
そこで、巷にあるアイコンをカスタムするアプリの方法を使って元号の書かれたアイコンを貼れないか試してみた。<br />
<span id="more-1592"></span><br />
まずアイコンをカスタムするのはWEBサイトのブックマークの方法の一つとして「ホーム画面に追加」というのがあり、これを選ぶとそのサイトが用意したアイコンがホーム画面に貼り付きます。<br />
このアイコンにURLの欄に起動したいソフトの<a href="http://samulife.com/iPhone/url-schem-write-up" target="_blank">URLスキーム</a>を指定するという方法です。<br />
（今回はアプリを起動する訳では無いのでとりあえずURLスキームは使いません。）</p>
<p>このWEBツールを作るに当たってGDで文字を書くようにしました。<br />
サーバー内のフォント一覧を調べるには下記のようにfindというlinuxの検索のコマンドを使います。</p>
<pre><code>find /usr/local/fonts -name "*.ttf"</code></pre>
<p>phpだと下記のようなスクリプトで検出できます。</p>
<pre><code>&lt;?php 
exec('find /usr/local/fonts -name "*.ttf"', $stdout);
print implode("&lt;br&gt;\n",$stdout);
?&gt;</code></pre>
<p>（もしCentOSだと/usr/local/fontsを&#8217;/usr/share/fonts&#8217;とかすると見つかるかと思います。）</p>
<p>coreserverの場合下記のような結果になりました。<br />
/usr/local/fonts/wadalab-gothic.ttf<br />
/usr/local/fonts/arib____.ttf<br />
/usr/local/fonts/helcbi__.ttf<br />
/usr/local/fonts/heli____.ttf<br />
/usr/local/fonts/timi____.ttf<br />
/usr/local/fonts/helb____.ttf<br />
/usr/local/fonts/timb____.ttf<br />
/usr/local/fonts/helbi___.ttf<br />
/usr/local/fonts/timbi___.ttf<br />
/usr/local/fonts/arir____.ttf<br />
/usr/local/fonts/helcr___.ttf<br />
/usr/local/fonts/starmath.ttf<br />
/usr/local/fonts/kochi-mincho.ttf<br />
/usr/local/fonts/chvor___.ttf<br />
/usr/local/fonts/watanabe-mincho.ttf<br />
/usr/local/fonts/helr____.ttf<br />
/usr/local/fonts/timr____.ttf<br />
/usr/local/fonts/kochi-mincho-subst.ttf<br />
/usr/local/fonts/sazanami-mincho.ttf<br />
/usr/local/fonts/chvr____.ttf<br />
/usr/local/fonts/kochi-gothic-subst.ttf<br />
/usr/local/fonts/kochi-gothic.ttf<br />
/usr/local/fonts/helcb___.ttf<br />
/usr/local/fonts/starbats.ttf<br />
/usr/local/fonts/cogb____.ttf<br />
/usr/local/fonts/helci___.ttf<br />
/usr/local/fonts/sazanami-gothic.ttf<br />
/usr/local/fonts/cogr____.ttf</p>
<p>日本語は8つあります。最近よく見かけるIPAフォントは無いですが十分です。<br />
渡部ゴシック（wadalab-gothic.ttf）<br />
渡部明朝（watanabe-mincho.ttf）<br />
東風ゴシック（kochi-gothic.ttf）<br />
東風明朝（kochi-mincho.ttf）<br />
東風ゴシック代用（kochi-gothic-subst.ttf）<br />
東風明朝代用（kochi-mincho-subst.ttf）<br />
さざなみゴシック（sazanami-gothic.ttf）<br />
さざなみ明朝（sazanami-mincho.ttf）</p>
<p>今回は「さざなみ明朝」にしました。</p>
<p>プログラム的には下記のように毎年画像が生成されるようにしました。</p>
<pre class="highlight"><code>&lt;?php 
$Y = date("Y");

$fname = './icon'.$Y.'.png';
$gengo = '平成';
$nensu = ($Y-1988);
if (!file_exists($fname)) {
	if (!extension_loaded('gd')) {
		exit('GDモジュールが無い。');
	}
	$img = imagecreatetruecolor(256, 256);
	$font = "/usr/local/fonts/sazanami-mincho.ttf";
	$background_color = imagecolorallocate($img, 64, 64, 64);
	imagefilledrectangle($img, 0, 0, 300, 300, $background_color);
	
	$text_color = imagecolorallocate($img, 255, 255, 255);
	imagettftext($img, 66,  0, 38,  95, $text_color, $font, $gengo);
	imagettftext($img, 121, 0, 50, 240, $text_color, $font, $nensu);
	imagepng($img, $fname);
	imagedestroy($img);
}
?&gt;</code></pre>
<p>後は作った画像をapple-touch-icon-precomposedで指定して完成です。</p>
<p><a href="http://gengo.uda2.com/" target="_blank">元号アイコン</a></p>The post <a href="https://uda2.com/blog/gengo_icon/">iPhoneに元号アイコン</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/gengo_icon/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>○○で始まる文字列検索の速度比較</title>
		<link>https://uda2.com/blog/phpstrspeed/</link>
					<comments>https://uda2.com/blog/phpstrspeed/#respond</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Thu, 17 Apr 2014 11:53:46 +0000</pubDate>
				<category><![CDATA[制作日記]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[高速化]]></category>
		<guid isPermaLink="false">http://uda2.com/blog/?p=1480</guid>

					<description><![CDATA[<p>PHPにて「○○で始まる文字列」を検索する場合、一番に思いつくのは正規表現だけど重いのでstrposで検索していたがstrposは検索位置を返すし全体を検索するのでなんとなく遅いかなと思い別の方法を模索してみた。 PHP</p>
The post <a href="https://uda2.com/blog/phpstrspeed/">○○で始まる文字列検索の速度比較</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>PHPにて「○○で始まる文字列」を検索する場合、一番に思いつくのは正規表現だけど重いのでstrposで検索していたがstrposは検索位置を返すし全体を検索するのでなんとなく遅いかなと思い別の方法を模索してみた。</p>
<p><a href="http://selfkleptomaniac.org/archives/45" target="_blank">PHPのパフォーマンス改善(3) | Selfkleptomaniac</a><br />
という記事にstrncmpを含んだ3つの方法が書かれていたので計5つの方法のベンチを取って比較してみた。<br />
（各秒数は約8万行を検索したしたベンチの10回分の平均値。）</p>
<p>strncmp版（先頭から特定文字数分検索する関数）<br />
if (!strncmp($myvalue, $searchstr, 5)) ～<br />
0.0312 sec</p>
<p>substr版（文字列を部分抽出する関数）<br />
if (substr($myvalue, 0, 5) == $searchstr) ～<br />
0.0447 sec</p>
<p>preg_match版（正規表現を利用した検索）<br />
if (preg_match(&#8216;!^&#8217;.$searchstr.&#8217;!&#8217;, $myvalue)) ～<br />
0.0578 sec </p>
<p>substr_compare版（特定部分から特定文字数分検索する関数）<br />
if (substr_compare($myvalue, $searchstr, 0, 5) == 0) ～<br />
0.0415 sec </p>
<p>strpos版（文字列の開始位置を検索する関数）<br />
if (strpos($myvalue, $searchstr) === 0) ～<br />
0.0297 sec </p>
<p>おっしゃる通り「strncmp」は速く「preg_match」は遅いが「strpos」が予想以上に速く、<a href="http://uda2.com/blog/2007/07/post_5/" target="_blank">単純な文字列の検索</a>も今回のような特定位置の文字列検索も「strpos」が最速という結果になった。</p>The post <a href="https://uda2.com/blog/phpstrspeed/">○○で始まる文字列検索の速度比較</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/phpstrspeed/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
