PHP

また、同じ罠にハマってた…orz
bootstrap4のpopoverはsanitizeオプションに気をつけろ

てか、↑の記事、結局どうすればいいか書いてないな(-_-;)
リンクも切れてるし(~_~;)
内容にも誤りがあるなぁ(@_@;)

という訳で、書き直そう。

sanitizeオプションは、contentやtitleなどで指定する内容から有害そうな内容を取り除くというオプション。デフォルトはtrueなので有効。なので、指定しないと<input>タグなどのフォーム部品の類は取り除かれてしまう、ということみたいでーす。

htmlオプションでHTMLを有効にして、その中にフォーム部品が含まれている場合は、《危険性を理解した上で》sanitizeオプションにfalseを指定しましょう。

というわけで、こんな感じ。
$(elem).popover({
content: 'お名前:<input type="text" name="name" />',
html: true,
sanitize: false
});
三日坊主失脚!ファンの皆様(そんな奴おれへんやろ〜)、ご無沙汰しております。
もう数年は放置したと思っていたけど、前回の投稿がちょうど半年前だったのに面食らった管理人でーす(^o^)v
キャラ変わってるしー。いや、ただ寝不足でハイになってるだけだよー\(^o^)/

さて、早速(どこが)本題に入ります。
preg_match関数の使用例です。
$str = 'んなこと言われたらアンタ、チッチキチーやで〜';
if (preg_match('/^(.*)(チ.*)$/', $str, $matches)) {
echo $matches[2];
} else {
echo '往生しまっせ〜';
}

こんな感じで$matches変数を使いますよねー。
でも、これだとIDEには$matchesは未定義だと怒られます。
なので、
$matches = array();

などと初期化してみたりする訳だが…

preg_matchする度にイチイチ初期化するのメンドいのヽ(`Д´)ノ

この問題、どこかで取り上げられてるんじゃないかなーと思って検索しても、ほぼ皆無。
(検索語の選択が悪かったのかなぁ)
みんなはどうしているのかなぁ(?_?)
フツーに毎回初期化してるのか…
フツーにIDEの指摘を無視してるのか…

以下、蛇足です。検索しても望むような回答が得られなかったという話をクドクドとしているだけ。。
続きを読む
PHP5の環境とPHP7の環境とで実行結果が異なる事象が発生した。
原因は下記だった。
引数を調べる関数は、パラメータの その時点での 値を報告する

ナンノコッチャわからん。。。
具体例をそのまま引用させていただく。
function foo($x) {
$x++;
var_dump(func_get_arg(0));
}
foo(1);

PHP5 の場合「1」が出力され、PHP7だと「2」となる。
直感的にはPHP5の挙動が自然だと思うのだが、他の言語との兼ね合い(調和?迎合?)なのかなぁ。

私の場合、関数の引数をそのまま再利用して上書きするという、「PHPらしい」(と私は思っている)実装をしたため、問題が発生してしまいました(^_^;)

なんとなく、PHPがJAVA化していっているような気がする今日このごろ、皆様方におかれてはいかがでしょうか(ナンノコッチャ)?
掲題の通りなのですが、大きいと言っても、たかが百数十メガバイト、今どきさほど大きくはないような気もするようなサイズなのだが…。
エラーになるのは仕方ないんだけど、phpMyAdminのエラーメッセージが「Incorrect format parameter」ってだけで、原因がさっぱりわからない┐(´д`)┌サパーリ

っというお話でした。結論は、↓です。
phpMyAdmin:「Incorrect format parameter」、「スクリプトがタイムアウトしました」エラー発生時の対処方法

つまり、よくあるphp.iniのファイルサイズ制限の関連の設定。
PHPをついに「PHP7」にバージョンアップしたため、これらの設定がデフォルトになってしまっていた。いつものことだから設定しなければならないと思っていたんだけど、漏れていた…orz
掲題の通り、FPDI(+TCPDF)を使用してPDFを出力しているのだが、濁点・半濁点が表示されないとのご指摘を受けた。
↓こんな感じ(□←こんな四角いのが出てるのは使用中のフォントで未定義のためで、IPAフォントとか使えば濁点・半濁点は(2文字になって)表示されるはず。この四角いのって、「豆腐」と呼ばれていて、外国でも「TOFU」と呼ばれているらしい)。
dakuten_bf

◎解決方法

原理などはさておき、コードを貼っておきます。
class DakutenFixer {
const DAKUTEN_NFD = '゙'; // 濁点の「結合文字」
const HANDAKUTEN_NFD = '゚'; // 半濁点の「結合文字」
const DAKUTEN_HANKAKU = '゙';
const HANDAKUTEN_HANKAKU = '゚';
public static function fix($str) {
if (false !== mb_strpos($str, self::DAKUTEN_NFD, 0, 'utf8')
|| false !== mb_strpos($str, self::HANDAKUTEN_NFD, 0, 'utf8')) {
$str = str_replace(
array(self::DAKUTEN_NFD, self::HANDAKUTEN_NFD),
array(self::DAKUTEN_HANKAKU, self::HANDAKUTEN_HANKAKU),
$str);
// カタカナを処理する(これによって元々存在する半角カタカナも全角化されます)
$str = mb_convert_kana($str, 'k', 'utf8');
$str = mb_convert_kana($str, 'KV', 'utf8');
// ひらがなを処理する
$str = mb_convert_kana($str, 'h', 'utf8');
$str = mb_convert_kana($str, 'HV', 'utf8');
}
return $str;
}
}

「結合文字」のところの表示がおかしくなっているかと思いますが、気にせず範囲指定してコピペしてください。当方の環境では正しくコピペできました。(ペースト先でも表示がおかしくなるでしょうが、気にせず使ってみてください)
↓こんな感じで使ってください。
$fixed_str = DakutenFixer::fix($str);

先程の出力が、↓のように正常になる!…はずです(^o^;)
dakuten_af

◎事象のイキサツをつらつらと…

どうやらMac環境で入力された文字列が悪さ想定外の動きをしているらしい。
調べてみると、NFD形式??NFC形式?に変換すると良いらしい???
うーん、なんかね。
結合文字列と言って、データ的には2文字なんだけど見た目は1文字、な文字列があって、それがPDFでは出力できないみたい。いや、TCPDF側の問題なのかもしれないけど…詳しくは調べてません…あしからず(゚∀゚)
もうどうしようもないじゃんー、と思ったけど、世の中には解決方法を編み出してしまう天才が存在します(後述の「参照元」を参照のこと)。
結合文字列を構成する結合文字を探し出して、その1文字手前の文字を濁音化しようというもの。
なるほどねー。
でも、ひらがなカタカナを全文字並べて濁音との変換用配列を作っていて、なんとなくスマートでない感じ(こんなこと言ってごめんなさいぃぃm(_ _)m)。
濁音をつける関数とか存在しないのかねぇ…と思ったけど、、、
無 か っ た。
でもね、世の中には(ry
全角文字に濁点文字「゛」をつけてmb_convert_kana()を使って一旦半角化した後、「V」オプションを用いて全角化すると、濁音化した1文字になる、という理論。
これを応用して、先の「結合文字の濁点」を「半角の濁点文字」に変換した後、全体を半角化する。
すると結合文字列だった文字列は「半角文字+半角濁点」になるので、再度全角化すれば、1文字化完了!という算段です\(^o^)/

◎参照元

Macのファイル名(NFD形式)をNFC形式に変換するPHPのロジック
↑こちらでも同じ結果が得られると思われます。
というか、こちらの記事にインスパイアされて当記事ができたんだよね(^o^;)
こちらのほうが確実に期待したとおりに動くのではないかと…。
当方のはmb_convert_kana()に頼っているので、想定外の動きがある可能性もありですからね。。。

Unicode結合文字列の怪 Mac OS X & fish shell & JavaScript編
こちらに今回の事象の原因となる「結合文字列」について詳しく書いてあります。
そして、↑の記事の参照元↓で、、
Mac OS X は結合文字列だらけ

Macよ。なぜにそんな特殊なことをした…orz

PHP 半角/全角 変換 mb_convert_kana()の濁点半濁点処理の罠について | 或るエンジニアの trash logs - 10倍役に立たないweblog (再々)
こちらの記事のおかげでmb_convert_kana()の使用を思いつきました。
こちらに書かれている通り、「ヱ」などの異体字の情報は失われてしまいますが、まず使わないでしょうよ!
そして、半角カタカナに一旦変換するため、元々存在する半角カタカナと区別がつかなくなり、そちらも全角化してしまいます。でも、今時半角カタカナなんて使わないっしょ!!