ZARU(ざる)のWeb系ブログですー。プログラミング&デザイン関係のTipsとか色々と。

PHPでHTMLをパースする

木曜日, 4月 15th, 2010

XMLじゃなくて、HTMLを解析したい…。しかもPHPで。

XMLだと、simplexml_load_file()っていう便利な関数がPHP5からあるけれど、HTMLはタグを取り除くぐらいしかない…というわけで、探してみたらHTMLをパースするライブラリがあった。

その名もまんまな、PHP Simple HTML DOM Parser。

使い方

include('simplehtmldom/simple_html_dom.php');
$html = <<<EOM
<ul>
    <li>aaa</li>
    <li>bbb</li>
    <li>ccc</li>
</ul>
EOM;
$data = str_get_html($html);
foreach($data->find('li') as $element){
    echo $element->plaintext;
}
#=>aaabbbccc

//URLやフィある名を指定して取得することも出来。
//その際は、 str_get_html() ではなく file_get_html() 。
$html = file_get_html('http://www.yahoo.co.jp/');

簡単な使い方は上記の通り。サイトにも書いてある通り、jQueryチックな使い方ができるので、以下のようなこともできる。

include('simplehtmldom/simple_html_dom.php');
$html = <<<EOM
<ul>
    <li>aaa</li>
    <li id="hoge">bbb</li>
    <li>ccc<strong>ddd</strong></li>
</ul>
EOM;
$data = str_get_html($html);
foreach($data->find('#hoge') as $element){
    echo $element->plaintext;
}
#=>bbb
foreach($data->find('li strong') as $element){
    echo $element->plaintext;
}
#=>ddd
echo $data->find('li',1)->id;
#=>hoge

データを抜き出すだけではなく、HTMLを書き換えることもできる。

    $html = <<<EOM
<ul>
    <li>aaa</li>
    <li>bbb</li>
    <li>ccc</li>
</ul>
EOM;

    $data = str_get_html($html);
    $data->find('ul',0)->class = 'hoge';
    $data->find('li',2)->innertext = 'piyo';
    echo $data;
#=><ul class="hoge">
#=> <li>aaa</li>
#=> <li>bbb</li>
#=> <li>piyo</li>
#=></ul>

非常に便利なので、色々と使い道がありそう。

PHPで複数の一括置換 str_replace

火曜日, 4月 13th, 2010

PHPで複数の一括置換がしたい…

こんなお悩み、普通のPHPerなら悩む必要ないよね。あーあ、なんで今まで気がつかなかったんだろう。アホすぎる。普通にstr_replace() で実現可能じゃないか。置換対象に配列指定可能。

$str = 'iPad欲しい。Xperia欲しい。お金欲しい。';
$search = array('iPad','Xperia','お金');
echo str_replace($search,'彼女',$str);
#=> 彼女欲しい。彼女欲しい。彼女欲しい。
$str = 'iPad欲しい。Xperia欲しい。お金欲しい。';
$search = array('iPad','Xperia','お金');
$replace = array('あれも','これも','もっともっと');
echo str_replace($search,$replace,$str);
#=> あれも欲しい。これも欲しい。もっともっと欲しい。

置換する順序

配列で複数指定した場合の置換する順序は、配列の一番上から。つまり左から右へ。

$str = 'a';
$search = array('a','b','c');
$replace = array('b','c','d');
echo str_replace($search,$replace,$str);
#=> d

CakePHPをPHP5.3で使うとエラーになる時の対処法

水曜日, 3月 10th, 2010

PHP5.3だとエラーが色々と…

PHP5.1からPHP5.3へアップデートをすると、CakePHP1.2においてエラーが出てしまったので、その場合の対処法。

Deprecatedエラーが出る

Deprecated: Assigning the return value of new by reference is deprecated in云々なエラー。

  • cake/libs/configure.php (295行目付近)
if (isset($config['debug'])) {
	if ($_this->debug) {
		error_reporting(E_ALL);
		//下記追加
		if (error_reporting() > 6143) {
			error_reporting(E_ALL & ~E_DEPRECATED);
		}
		//ここまで

strtotime()でタイムゾーンのエラーが出る

Warning: strtotime() [http://php.net/function.strtotime]: It is not safe to rely on the system’s timezone settings.というエラー。

  • /etc/php.ini
[Date]
; Defines the default timezone used by the date functions
;date.timezone =
date.timezone =Asia/Tokyo

と、タイムゾーンを設定してやれば大丈夫。