<?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>何もない場所 &#187; PHP</title>
	<atom:link href="http://blog.chisyamori.com/kay/category/web/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.chisyamori.com/kay</link>
	<description>──あなたの心の琴線に触れるようなものは何もないです。かといって、他の何があるわけでもないですが。</description>
	<lastBuildDate>Fri, 23 Dec 2011 21:39:39 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>pukiwikiのスパム対策</title>
		<link>http://blog.chisyamori.com/kay/2006/05/05/44/</link>
		<comments>http://blog.chisyamori.com/kay/2006/05/05/44/#comments</comments>
		<pubDate>Fri, 05 May 2006 09:39:35 +0000</pubDate>
		<dc:creator>KAY</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[WEB制作]]></category>

		<guid isPermaLink="false">http://blog.chisyamori.com/kay/?p=44</guid>
		<description><![CDATA[最近OekakiBBS Wikiの方でスパム投稿がひどくて困ってたんですが、このほどスパム対策を施してみました。 なんか、マルチバイト文字を含まない投稿を弾くというのが結構効くらしい、という事で、trackerプラグイン [...]]]></description>
			<content:encoded><![CDATA[<p>最近<a href="http://kay.chisyamori.com/oekaki/wiki/" rel="outside">OekakiBBS Wiki</a>の方でスパム投稿がひどくて困ってたんですが、このほどスパム対策を施してみました。<br />
なんか、マルチバイト文字を含まない投稿を弾くというのが結構効くらしい、という事で、trackerプラグインを改造して実装してみる事に。<br />
trackerプラグインから投稿があった時に、以下の処理を実行します。</p>
<p><span id="more-44"></span></p>
<pre>    //KAY追加部分
    $flag = true;
    $str_tmp = $post["_name"] . $post["name"] . $post["url"] . $post["body"];
    $n = strlen($str_tmp);
    for($i = 0; $i &lt; $n; $i++) {
        if(ord(substr($str_tmp, $i, 1)) &gt;= 0x80) {
            $flag = false;
            break;
        }
    }
    if($flag) {
        return array(
            'msg'=&gt;'cannot write',
            'body'=&gt;'error.'
        );
    }
    //KAY追加部分ここまで</pre>
<p>$postというのはPOSTで渡ってきたデータらしいです。やり方としては、これで合ってるんだろうか。<br />
ちょい様子見～。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chisyamori.com/kay/2006/05/05/44/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>テンプレートクラス</title>
		<link>http://blog.chisyamori.com/kay/2006/04/30/43/</link>
		<comments>http://blog.chisyamori.com/kay/2006/04/30/43/#comments</comments>
		<pubDate>Sun, 30 Apr 2006 08:06:39 +0000</pubDate>
		<dc:creator>KAY</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[WEB制作]]></category>

		<guid isPermaLink="false">http://blog.chisyamori.com/kay/?p=43</guid>
		<description><![CDATA[簡素なPHPのテンプレートクラス。置換、ループ、ifが使えます。 class template { var $pieces; //テンプレート。ファイル名か、あるいは文字列そのものを配列で格納する。 var $dir;  [...]]]></description>
			<content:encoded><![CDATA[<p>簡素なPHPのテンプレートクラス。置換、ループ、ifが使えます。</p>
<p><span id="more-43"></span></p>
<pre>class template {
    var $pieces;               //テンプレート。ファイル名か、あるいは文字列そのものを配列で格納する。
    var $dir;                  //テンプレートが置かれているディレクトリ
    var $assigns;              //置換文字列バッファ
    var $if;                   //ifバッファ
    var $loops;                //ループバッファ
    var $loop;                 //カレントのループ
    var $exit = true;          //flushした時点でスクリプトを終了させるかどうか。
    var $ret_str = false;      //flushした時に出力を行わず、文字列を返す場合はtrue

    //コンストラクタ
    function template($list, $dir = "./") {
        $this-&gt;pieces = $list;
        $this-&gt;dir = $dir;
        $this-&gt;assigns = array();
        $this-&gt;if = array();
        $this-&gt;loops = array();
    }

    //改行コードを統一
    function CR($str) {
        $str = str_replace("\\r\\n", "\\n", $str);
        $str = str_replace("\\r", "\\n", $str);
        return $str;
    }

    //ループの定義
    function set_loop($loop) {
        $this-&gt;loop = $loop;
        $this-&gt;loops[$loop] = array();
    }

    //割り当て
    function assign($name, $value) {
        $this-&gt;loops[$this-&gt;loop][$name][] = $value;
    }

    //出力
    function flush() {
        $html = "";

        //ファイルの読み込み
        foreach($this-&gt;pieces as $val) {
            $file = $this-&gt;dir . ((substr($this-&gt;dir, -1) == "/")? "": "/") . $val;
            if(file_exists($file)) {
                $html .= file_get_contents($file);
            } else {
                $html .= $val;
            }
        }
        $html = $this-&gt;CR($html);

        //if処理
        preg_match_all("/%if:(.+?)%/", $html, $match);
        foreach($match[1] as $val) {
            $html = preg_replace("/\\s*%if:" . $val . "%(.*?)\\s*%endif:" . $val . "%/s", (isset($this-&gt;if[$val]) &#038;&#038; $this-&gt;if[$val])? "$1": "", $html);
        }

        //ループ処理
        foreach($this-&gt;loops as $key =&gt; $val) {
            preg_match("/\\s*%loop:" . $key . "%(.*?)\\s*%next:" . $key . "%/s", $html, $matches);

            $names = array_keys($val);
            $values = array_values($val);
            array_walk($names, create_function('&#038;$names', '$names = "%" . $names . "%";'));

            $inner = "";
            $n = count(isset($values[0])? $values[0]: array());
            while($n--) {
                foreach($values as $key2 =&gt; $val2) {
                    $replace[$key2] = array_shift($values[$key2]);
                }
                $inner .= str_replace($names, $replace, $matches[1]);
            }

            $html = preg_replace("/\\s*%loop:" . $key . "%.*?\\s*%next:" . $key . "%/s", $inner, $html);
        }

        //置換処理
        foreach($this-&gt;assigns as $key =&gt; $val) {
            $html = str_replace("%" . $key . "%", $val, $html);
        }

        if($this-&gt;ret_str) { return $html; } else { echo $html; }
        if($this-&gt;exit) { exit(); }
    }
}</pre>
<p>●使い方</p>
<pre>$tmpl = new template(array("header.html", "hoge.html"), "template");</pre>
<p>でインスタンスを作成します。第一引数は配列なので、複数のファイル名を指定できます。<br />
最終的には配列の順番で各ファイルは結合されて出力されます。</p>
<pre>$tmpl-&gt;flush();</pre>
<p>でテンプレートを出力します。</p>
<pre>$tmpl-&gt;pieces[1] = "foo.html";</pre>
<p>のようにして後からテンプレートファイルを差し替える事も可能。<br />
第二引数はテンプレートファイルが置かれたディレクトリを指定します。最後の「/」はあっても無くても構いません。<br />
絶対指定でもカレントからの相対指定でも可。省略した場合はカレントのディレクトリからファイルを探します。</p>
<p>○置換</p>
<pre>※テンプレート側の記述
&lt;input type="text" name="hogege" value="%val%"&gt;

※スクリプト側の記述
$tmpl-&gt;assigns["val"] = "hogehoge";

●結果
&lt;input type="text" name="hogege" value="hogehoge"&gt;</pre>
<p>○ループ</p>
<pre>※テンプレート側の記述
&lt;ul&gt;
%loop:list%
    &lt;li&gt;%name%&lt;/li&gt;
%next:list%
&lt;/ul&gt;

※スクリプト側の記述
$arr = array("hoge", "foo", "bar");
$tmpl-&gt;set_loop("list");
foreach($arr as $val) {
    $tmpl-&gt;assign("name", $val);
}

●結果
&lt;ul&gt;
    &lt;li&gt;hoge&lt;/li&gt;
    &lt;li&gt;foo&lt;/li&gt;
    &lt;li&gt;bar&lt;/li&gt;
&lt;/ul&gt;</pre>
<p>○if</p>
<pre>※テンプレート側の記述
&lt;h1&gt;見えるかな？&lt;/h1&gt;
%if:message%&lt;p&gt;見えてますね？&lt;/p&gt;%endif:message%
&lt;p&gt;どうでしょう。&lt;/p&gt;

※スクリプト側の記述
$tmpl-&gt;if["message"] = true;

●結果
&lt;h1&gt;見えるかな？&lt;/h1&gt;
&lt;p&gt;見えてますね？&lt;/p&gt;
&lt;p&gt;どうでしょう。&lt;/p&gt;

※スクリプト側の記述
$tmpl-&gt;if["message"] = false;

●結果
&lt;h1&gt;見えるかな？&lt;/h1&gt;
&lt;p&gt;どうでしょう。&lt;/p&gt;</pre>
<p>ifはtrue以外は常に非表示となるので、表示させる時だけtrueを指定する、という感じでいいと思います。</p>
<p>デフォルトではflush()を実行した時点でスクリプトが終了してしまいます。</p>
<pre>$tmpl-&gt;exit = false;</pre>
<p>とするとflush()後もスクリプトは続行します。<br />
また、</p>
<pre>$tmpl-&gt;ret_str = true;</pre>
<p>とすると出力を行わず、結果を文字列として返します。</p>
<pre>$tmpl-&gt;ret_str = true;
$html = $tmpl-&gt;flush();</pre>
<p>でflush()の結果が$htmlに代入されます。ちなみに、ret_strがtrueの場合、exitがtrue（デフォルト）でもスクリプトは終了しません。</p>
<p>あと、CR()は改行を「\n」に置換します。便利なので何かっつーと</p>
<pre>$str = template::CR($str);</pre>
<p>みたいな感じで使ってます。</p>
<p>う～ん、説明すべき部分はこんなもんかなあ。なんか、ループを入れ子に出来るようにしようと思ったんだけど、脳が沸騰しそうになったのでやめた。<br />
あーループといえば、ほんとはこれもメソッドじゃなくて配列だけでプロパティとして扱いたかったんだよなあ……。いや、現時点の仕様でもそういう風に扱えるんだけど。<br />
あまりに多次元すぎて逆に判りにくいかなと。で、配列を意識しなくて済むようにメソッドを実装しました……。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chisyamori.com/kay/2006/04/30/43/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

