ワードプレスのEXEC-PHPプラグインの簡易版を作ってみる。


スポンサーリンク

ワードプレスのEXEC-PHPは、ワードプレスの記事にPHPを書き込めるめちゃめちゃ便利なプラグイン。
ところが、PHPのバージョンが上がったら動かなくなったわけ。

他にも似たようなプラグインがあるからそれを使えばいいんだけどね。

でも原理を知っていれば、便利だよね。
そこで簡易版を書いてみた。

EXEC-PHP の原理


実際 EXEC-PHP をリバースしたわけじゃないけど、どうやったら実現できるか。

答えは eval を使う。

eval は、PHPの中でPHPを動かしてくれる関数だ。
ところが、普通にeval だけを使うと echo 系は、呼び出したときに結果を吐き出してしまう。

それをバッファリングさせる関数があるのだ。
ob_start、ob_get_contents、ob_end_clean がそれだ。

ところが eval ってのは癖があって文章ないの <?php ~ ?> 内を処理してくれるのではなく ~ 部分を渡さないと処理してくれない。

要するに <?php ~ ?> の ~ 部分を抜き出して eval に渡して結果をつなぎ合わせないといけない。

わかりやすく文字列ポインタを使って書き下ろした。

参考になれば幸いです。

text には、<?php を含んだ文章が入ってくるものとする
戻りは <?php 内を処理した文章。
function entry_inline_phprepl($text)
{
	$line = '';
	//$text = ' '.$text; // 0もfalse も同じ。比較に !== を使うってめんどい場合はこうやるといい。もちろんあとで頭の空白は捨てる
	$ps = strpos($text,"<?php");
	while($ps!==false){
		$line.= substr($text,0,$ps);
		$text = substr($text,$ps+5);
		$ps   = strpos($text,"?>");
		if( $ps!==false ){
			$blck = substr($text,0,$ps);
			try {
				eval('ob_start(); '.$blck.'; $blck = ob_get_contents();ob_end_clean();');
			} catch (Exception $e) { echo 'gegege!='.$e; }
			$line.=$blck;
			$text = substr($text,$ps+2);
		}
		$ps = strpos($text,"<?php");
	}
	return $line.$text;
}





スポンサーリンク