Archives by date

You are browsing the site archives by date.

【PHP】文字列をユニコードエンコードする。

素晴らしいコードを発見したのでペタリ。

// 文字列のユニコードデコードを行う
function unicode_decode($str) {
  return preg_replace_callback("/((?:[^\x09\x0A\x0D\x20-\x7E]{3})+)/", "decode_callback", $str);
}

function decode_callback($matches) {
  $char = mb_convert_encoding($matches[1], "UTF-16", "UTF-8");
  $escaped = "";
  for ($i = 0, $l = strlen($char); $i < $l; $i += 2) {
    $escaped .=  "\u" . sprintf("%02x%02x", ord($char[$i]), ord($char[$i+1]));
  }
  return $escaped;
}

// 文字列のユニコードエンコードを行う
function unicode_encode($str) {
  return preg_replace_callback("/\\\\u([0-9a-zA-Z]{4})/", "encode_callback", $str);
}

function encode_callback($matches) {
  $char = mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UTF-16");
  return $char;
}

※英数字、及び記号はエスケープされないので注意されたし。
そしてこれ、PHP6からはネイティブで実装されるらしい。いやPHP5で追加してくれよ。

 

【PHP】波ダッシュを文字列から取り除く。

波ダッシュのせいで色々と詰まりましたよと。

preg_replace('/\xE3\x80\x9C/', '', $string);

これで奴らを無力化出来るじぇじぇじぇ。

 

【PHP】CakePHPでソケット通信を行う。

ウェブサイト上のページコンテンツなどを取得したい場合に便利。

■GETリクエスト

App::uses('HttpSocket', 'Network/Http');
$HttpSocket = new HttpSocket();
$response = $HttpSocket->get('http://example.com');

■PSOTリクエスト

App::uses('HttpSocket', 'Network/Http');
$HttpSocket = new HttpSocket();
$response = $HttpSocket->post('http://example.com', ['key' => 'value']);

下記ページが大変参考になりました。

http://lennaert.nu/2013/12/01/how-to-use-httpsocket-instead-of-curl-in-cakephp-2/

 

【PHP】Simple_HTML_DOMの使い方メモ。

自分用。

■HTMLファイルの流し込み方

// 文字列
$html = str_get_html( '<html><head></head><body><p>hoge</p></body></html>' );

// URL
$html = file_get_html( 'http://example.com' );

// HTMLファイル
$html = file_get_html( 'hoge.html' );

■要素の取得方法

// 全てのdiv要素を取得
$res = $html->find('div');

// 見つけたdiv要素の先頭を取得
$res = $html->find('div', 0);

// id="hoge"なdiv要素を取得
$res = $html->find('div[id=hoge]');

// idを持っているdiv要素全てを取得
$res = $html->find('div[id]');

// idを持っている要素全てを取得
$res = $html->find('[id]');

// 全てのdiv要素を取得
$res = $html->find('div');

※基本的にはCSSセレクタと同様の記述が可能。
※find()の第2引数にindexを指定していない場合、マッチした要素が1つであっても結果はつねに配列で返されるため、連結したい場合は必ずindexを指定すること。

例)

$res = $html->find( 'div[id=hoge]', 0)->find( 'div.hoge', 0);

■コンテンツ(中身)を取得する

echo $html->find( 'div', 0)->tag; // Returns: " div"
echo $html->find( 'div', 0)->outertext; // Returns: " <div>foo <b>bar</b></div>"
echo $html->find( 'div', 0)->innertext; // Returns: " foo <b>bar</b>"
echo $html->find( 'div', 0)->plaintext; // Returns: " foo bar"

■メモリを解法する

このライブラリはクッソ重たいのでこまめにメモリを開放して上げる必要がある。
といっても下記メソッドを実行するだけで良い。

$html->clear();

ざっとこんな感じかな。

 

【Javascript】指定した要素のonChangeイベントを強制発火させる。

メモ。

document.getElementById('id').onchange();

※idは任意のものを指定。

 

【PHP】cURL VS fread。

ウェブ上のコンテンツを取得する際、cURLとfreadではどちらが早いのか気になったので調べてみた。

結果はstackoverflowで見つけたのでペタリ。

■fread

$start = microtime(true);
$f = fopen('http://example.com','r');

$response = fread($f, 3);
echo $response;

$response = fread($f, 3);
echo $response;

$response = fread($f, 3);
echo $response;

$response = fread($f, 3);
echo $response;

$response = fread($f, 3);
echo $response;

$stop = round(microtime(true) - $start, 5);
echo "{$stop}s";
exit();

■cURL

$start = microtime(true);
$curl = curl_init('http://example.com');
curl_setopt($curl, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($curl, CURLOPT_RANGE, "0-2");
$response = curl_exec($curl);
echo $response;

curl_setopt($curl, CURLOPT_RANGE, "3-5");
$response = curl_exec($curl);
echo $response;

curl_setopt($curl, CURLOPT_RANGE, "6-8");
$response = curl_exec($curl);
echo $response;

curl_setopt($curl, CURLOPT_RANGE, "9-11");
$response = curl_exec($curl);
echo $response;

curl_setopt($curl, CURLOPT_RANGE, "12-14");
$response = curl_exec($curl);
echo $response;

curl_close($curl);

$stop = round(microtime(true) - $start, 5);
echo "{$stop}s";
exit();

■result

・fread
1.1 seconds

・cURL
2.5 seconds

■結論
freadのほうが早い模様。
cakePHPのcoreでもcURLじゃなくてfreadが使われてるし、こちらのほうがパフォーマンスに優れているのかな?