SQLの窓

2017年04月15日


PHP で漢字スペースと通常スペースのトリムとPHP正規表現チェッカー(置き換え)

※ 昔使っていた『PHP正規表現チェッカー』のサイトが閉鎖されたので他のサイトに変更しました

PHP では trim と言う関数で、文字列の先頭および末尾にあるホワイトスペースを取り除く事ができますが、デフォルトでは以下の文字を削除します。
" " (ASCII 32 (0x20)), 通常の空白。
"\t" (ASCII 9 (0x09)), タブ。
"\n" (ASCII 10 (0x0A)), リターン。
"\r" (ASCII 13 (0x0D)), 改行。
"\0" (ASCII 0 (0x00)), NULバイト
"\x0B" (ASCII 11 (0x0B)), 垂直タブ
で、日本語スペースはこのままでは削除してくれないので、追加してみると普通に削除してくれました。 Run Code で実行
<?php

    $kj = "漢字表示";
    $kj_space = " ";
    $a_space = " ";
   

    $str = "{$kj_space}{$a_space}{$kj}{$kj_space}{$a_space}";

    $str = trim($str, "{$a_space}\t\n\r\0\x0B{$kj_space}");
    
    print "|{$str}|";
    
?>
また、同様の結果を preg_replace で得る方法もテストしてみました。この場合重要なのは、パターン修飾子 の "u" でした。(パターンと対象文字列は、 UTF-8 として処理されます)

Run Code で実行
<?php

    $kj = "漢字表示";
    $kj_space = " ";
    $a_space = " ";
   

    $str = "{$kj_space}{$a_space}{$kj}{$kj_space}{$a_space}";

    $str = preg_replace( "/^[ \s]+/u", "", $str );
    $str = preg_replace( "/[ \s]+$/u", "", $str );
    
    print "|{$str}|";
    
?>

また、正規表現のパーターンを一つにして一回で置換する場合は以下のようになります
<?php

    $kj = "漢字表示";
    $kj_space = " ";
    $a_space = " ";
   

    $str = "{$kj_space}{$a_space}{$kj}{$kj_space}{$a_space}";

    $str = preg_replace( "/^[ \s]+|[ \s]+$/u", "", $str );
    
    print "|{$str}|";
    
?>
この場合、重要なのは | を使った構文です

確認は、PHP正規表現チェッカー(置き換え) で解りやすく行う事ができます

▼ パターン文字列は ^[ \s]+|[ \s]+$


PHP正規表現チェッカーで デベロッパーツールを F12 で開いて(コンソール) 以下を実行できます。
$("input[name='pattern").val("^[ \\s]+|[ \\s]+$");$("input[name='replacement']").val("削除");$("#subject").val("  漢字表示  ");$('#preg_replace').keyup();


※ このサイトでは、jQuery が使用されています


posted by lightbox at 2017-04-15 14:15 | PHP + ベーシック | このブログの読者になる | 更新情報をチェックする

2016年05月05日


PHP で HTML数値エンティティを、目的のキャラクタセットの文字列に変換する

テキストエディタが優秀な場合は、直接ソースに書いてもいいのですが、古いエディタだと UTF-8 の文字列を直接書けない場合もあります。もちろん、数値データから文字列化する処理に有効ですが、マニュアルには肝心の『変換するコード領域を指定する配列』の説明がありません

以下は簡単なサンプルですが、0x2A6D5 のほうは変換されず、0x2A6D6 のほうは変換されます
	$convmap = array(0x0, 0x2A6D5, 0, 0xFFFFF);
	$wk = mb_decode_numericentity("&#173782;", $convmap, 'UTF-8');	
	print $wk;

	$convmap = array(0x0, 0x2A6D6, 0, 0xFFFFF);
	$wk = mb_decode_numericentity("&#173782;", $convmap, 'UTF-8');	
	print $wk;

0x0 から 0x2A6D6 の範囲のみ変換します。0 はオフセットなので通常は 0 として使いません( 0x2A6D5 では、1 にすれば変換対象になります )。最後の 0xFFFFF はマスクなので、そのまま利用するという意味で全てのフラグが on である 0xFFFFF を使用しています

0x2A6D6 の漢字に関しては、こちらより確認して下さい



𪛖


タグ:PHP
posted by lightbox at 2016-05-05 19:38 | PHP + ベーシック | このブログの読者になる | 更新情報をチェックする

2015年11月02日


PHP : $_GET、$_POST、$_SESSION とグローバル変数全ての簡単な表示方法

$GLOBALS はスーパーグローバル変数を含む、ほぼ全てのグローバル変数を保持しています。そこで、print_r で取得できる内容から、正規表現で $_COOKIE と $_FILES を削除したものを表示しています。

※ 同時に get_include_path で、現在の include_path をパス単位で表示しています
<?php

$debug_string = print_r($GLOBALS,true);

$debug_string = preg_replace('/\n\s+\[_[C|F].+?\)/s', '', $debug_string);

print "<br><br><hr>";
print "<pre style='font-weight:bold;white-space:pre-wrap;'>";
print $debug_string;
print "--------------------------------------\n";
print_r( explode(PATH_SEPARATOR,get_include_path()) );
print "</pre>";

?>


print_r は、このように出力結果を文字列として戻す事ができるので、デバッグ時にファイルに出力するのに有効です

▼ 表示結果の例( windows )
Array
(
    [_GET] => Array
        (
            [update_type] => 1
            [syain] => 0053
            [order] => 氏名
        )

    [_POST] => Array
        (
        )

    [rpath] => C:\httpd142p\if_skeleton\lightbox99\
    [_SESSION] => Array
        (
            [charset] => utf-8
            [iframe_id] => target
        )

    [server] => localhost
    [db_name] => lightbox
    [user] => root
    [password] => パスワード
    [connect] => mysqli Object
        (
            [affected_rows] => 5
            [client_info] => mysqlnd 5.0.10 - 20111026 - $Id: e707c415db32080b3752b232487a435ee0372157 $
            [client_version] => 50010
            [connect_errno] => 0
            [connect_error] => 
            [errno] => 0
            [error] => 
            [error_list] => Array
                (
                )

            [field_count] => 12
            [host_info] => localhost via TCP/IP
            [info] => 
            [insert_id] => 0
            [server_info] => 5.6.17
            [server_version] => 50617
            [stat] => Uptime: 15857  Threads: 1  Questions: 288  Slow queries: 0  Opens: 71  Flush tables: 1  Open tables: 64  Queries per second avg: 0.018
            [sqlstate] => 00000
            [protocol_version] => 10
            [thread_id] => 76
            [warning_count] => 0
        )

    [query] => select * from `社員マスタ`
where 管理者 is NULL order by 氏名

    [result] => Array
        (
            [0] => 社員マスタ
            [1] => mysqli_result Object
                (
                    [current_field] => 0
                    [field_count] => 13
                    [lengths] => 
                    [num_rows] => 0
                    [type] => 0
                )

            [2] => コード名称マスタ
            [3] => mysqli_result Object
                (
                    [current_field] => 0
                    [field_count] => 7
                    [lengths] => 
                    [num_rows] => 3
                    [type] => 0
                )

            [4] => 社員マスタ
            [5] => mysqli_result Object
                (
                    [current_field] => 0
                    [field_count] => 12
                    [lengths] => 
                    [num_rows] => 5
                    [type] => 0
                )

        )

    [ErrorMessage] => 
    [php_errormsg] => Undefined variable: ErrorDisable
    [row] => 
    [sentaku] => 
    [GLOBALS] => Array
 *RECURSION*
)
--------------------------------------
Array
(
    [0] => .
    [1] => C:\php\pear
    [2] => C:\httpd142p\if_skeleton\lightbox99\common
    [3] => C:\httpd142p\if_skeleton\lightbox99\db
    [4] => C:\httpd142p\if_skeleton\lightbox99\view
)
データベースのテーブル別に配列を使って処理すると、後から確認しやすくなります
posted by lightbox at 2015-11-02 14:30 | PHP + ベーシック | このブログの読者になる | 更新情報をチェックする

Windows・Unix(Linux)共用、PHPの include_path の動的設定方法

まず、WEB用のパスでは、ファイルをサーチする事はできません。その OS が判断できる絶対パスを作成する必要があります。Unix(Linux) の場合は、WEBのフォルダの前に、実際の / からのパスを付加します。Windows の場合は、同様の処理を行いますが、/ を \ に変換する簡単な方法として realpath を使用しています。

※ Windows の realpath は、その場所が C ドライブだとすると、 / は C:\ に変換してくれます

PATH_SEPARATOR は、ファイルサーチ用の区切り文字で、Unix(Linux) では :(コロン)、Windows では ;(セミコロン)になります。

DIRECTORY_SEPARATOR は、それぞれ / と \ となります。

realpath では、実際にそのファイルが存在しないと何も返さないので注意して下さい。

get_include_path() で元々のパスを含める事を忘れないで下さい。(恐らく)デフォルトの環境で、. が含まれているはずで、それによってカレントディレクトリの検索が可能になっています。
<?php
$rpath = "/if_skeleton/lightbox99";
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
	$rpath = realpath( "/httpd142p{$rpath}" );
}
else {
	$rpath = "/home/lightbox/www/testweb{$rpath}";
}
$rpath .= DIRECTORY_SEPARATOR;
set_include_path(get_include_path() . PATH_SEPARATOR . "{$rpath}common" . PATH_SEPARATOR . "{$rpath}db" . PATH_SEPARATOR . "{$rpath}view");


関連する PHP ドキュメント

コア php.ini ディレクティブに関する説明 


posted by lightbox at 2015-11-02 14:12 | PHP + ベーシック | このブログの読者になる | 更新情報をチェックする

2015年05月28日


PHP : PHPコマンドラインから使用中の ini ファイルをチェック

php.exe --ini
( ※ PHP 5.2.3 以降で使用可能です )
他にも良く使いそうなのもののサンプルを以下に記述します
// バージョン表示
php -v
// 現在の日付
php -r "print date('Ymd');"
// タイムゾーンの確認
php --ri date

コマンドラインからの実行は、以下のようにエクスプローラで PHP フォルダを選択して、SHIFT しながら右クリックしてコマンドウインドウを開いて使用します。



PHP マニュアルへのリンク

PHP をコマンドラインから使用する
コマンドラインオプション
入出力ストリーム 


関連する記事


タグ:PHP
posted by lightbox at 2015-05-28 10:22 | PHP + ベーシック | このブログの読者になる | 更新情報をチェックする

2014年06月07日


GET メソッドでフォーム送信時にキャッシュを読まないように( 特に Google Chrome )


header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

WEB アプリケーションを作成する以上、http ヘッダにキャッシュコントロールは必ずセットしますが、それでも何故かキャッシュから読まれる場合があります。

他のトラブルを事前に解消する為にも、一時的には全てのキャッシュを削除するのは良い方法ではありますが解決にはなりません。

Google Chrome では、デベロッパーツールに、『Disable cache (while DevTools is open)』という機能もありますが、先日そうしていても submit ボタンがサーバーへアクセスしない事象に遭遇しました。

で、結局ベーシックな方法ではありますが、以下のように URL を常に変更してキャッシュから読まないようにするのが確実である事が解りました。

Google Chrome で発生した手順(localhostにて)

1) 問い合わせ画面から、window.open で新しいウインドウを開く。
2) そのウインドウでデータを削除し、ウインドウを閉じる
3) 元の問い合わせ画面が表示される( 隠れていたのが見えるようになっただけ )
4) submit ボタンを押しても反応が無い( Network で見ても反応なし )
5) なのに、右クリックからソースを見ると変わっている( 何故?? )

Google Chrome では、以前よりレンタルサーバを使ってサーバーを変更しても変化しないというような事がありました。とにかく、効率の良い表示のアルゴリズムで作成されているのでしょうが、バグもあるのだろう・・・というのが正直な感想です。
<input
	type="hidden"
	name="cache"
	value="<?= uniqid() ?>">



posted by lightbox at 2014-06-07 18:34 | PHP + ベーシック | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり