PHPプログラムに関する各種メモ書き:タグ「日本語」での検索

PHPでスペース区切りの文字列で検索文字をANDマッチする

いわゆるGoogleなどの検索エンジンのようにスペース区切りをANDマッチする方法

function list_and_match($data, $search_str_space_separated){
	$search_str_space_separated = mb_convert_kana($search_str_space_separated, "s");
	$search_list = array();
	$search_list = preg_split("/\s/",$search_str_space_separated);
	$flag = 1;
	foreach ($search_list as $v) {
		if ( ! preg_match("/{$v}/iu",$data) ){
			$flag = false;
			break;
		}
	}
	return $flag;
}
$text = "長い長い日本語のテストを行います。";
$search_text = "長い テスト";
if ( list_and_match($text, $search_text) ){
 echo 'マッチしました';
}
No.983
12/08 20:14

edit

日本語

PHPでPCの機種依存文字を検出し、変換(削除)する。

PHPでPCの機種依存文字を検出し、変換(削除)するには以下のようにします。

function replace_kishu_kanji( $subject='' ){
  $search  = array( '①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨', '⑩', '⑪', '⑫', '⑬', '⑭', '⑮', '⑯', '⑰', '⑱', '⑲', '⑳', 'Ⅰ', 'Ⅱ', 'Ⅲ', 'Ⅳ', 'Ⅴ', 'Ⅵ', 'Ⅶ', 'Ⅷ', 'Ⅸ', 'Ⅹ', '㍉', '㌔', '㌢', '㍍', '㌘', '㌧', '㌃', '㌶', '㍑', '㍗', '㌍', '㌦', '㌣', '㌫', '㍊', '㌻', '㎜', '㎝', '㎞', '㎎', '㎏', '㏄', '㎡', '㍻', '〝', '〟', '№', '㏍', '℡', '㊤', '㊥', '㊦', '㊧', '㊨', '㈱', '㈲', '㈹', '㍾', '㍽', '㍼', '∮', '∑', '∟', '⊿', '纊', '褜', '鍈', '銈', '蓜', '俉', '炻', '昱', '棈', '鋹', '曻', '彅', '丨', '仡', '仼', '伀', '伃', '伹', '佖', '侒', '侊', '侚', '侔', '俍', '偀', '倢', '俿', '倞', '偆', '偰', '偂', '傔', '僴', '僘', '兊', '兤', '冝', '冾', '凬', '刕', '劜', '劦', '勀', '勛', '匀', '匇', '匤', '卲', '厓', '厲', '叝', '﨎', '咜', '咊', '咩', '哿', '喆', '坙', '坥', '垬', '埈', '埇', '﨏', '塚', '增', '墲', '夋', '奓', '奛', '奝', '奣', '妤', '妺', '孖', '寀', '甯', '寘', '寬', '尞', '岦', '岺', '峵', '崧', '嵓', '﨑', '嵂', '嵭', '嶸', '嶹', '巐', '弡', '弴', '彧', '德', '忞', '恝', '悅', '悊', '惞', '惕', '愠', '惲', '愑', '愷', '愰', '憘', '戓', '抦', '揵', '摠', '撝', '擎', '敎', '昀', '昕', '昻', '昉', '昮', '昞', '昤', '晥', '晗', '晙', '晴', '晳', '暙', '暠', '暲', '暿', '曺', '朎', '朗', '杦', '枻', '桒', '柀', '栁', '桄', '棏', '﨓', '楨', '﨔', '榘', '槢', '樰', '橫', '橆', '橳', '橾', '櫢', '櫤', '毖', '氿', '汜', '沆', '汯', '泚', '洄', '涇', '浯', '涖', '涬', '淏', '淸', '淲', '淼', '渹', '湜', '渧', '渼', '溿', '澈', '澵', '濵', '瀅', '瀇', '瀨', '炅', '炫', '焏', '焄', '煜', '煆', '煇', '凞', '燁', '燾', '犱', '犾', '猤', '猪', '獷', '玽', '珉', '珖', '珣', '珒', '琇', '珵', '琦', '琪', '琩', '琮', '瑢', '璉', '璟', '甁', '畯', '皂', '皜', '皞', '皛', '皦', '益', '睆', '劯', '砡', '硎', '硤', '硺', '礰', '礼', '神', '祥', '禔', '福', '禛', '竑', '竧', '靖', '竫', '箞', '精', '絈', '絜', '綷', '綠', '緖', '繒', '罇', '羡', '羽', '茁', '荢', '荿', '菇', '菶', '葈', '蒴', '蕓', '蕙', '蕫', '﨟', '薰', '蘒', '﨡', '蠇', '裵', '訒', '訷', '詹', '誧', '誾', '諟', '諸', '諶', '譓', '譿', '賰', '賴', '贒', '赶', '﨣', '軏', '﨤', '逸', '遧', '郞', '都', '鄕', '鄧', '釚', '釗', '釞', '釭', '釮', '釤', '釥', '鈆', '鈐', '鈊', '鈺', '鉀', '鈼', '鉎', '鉙', '鉑', '鈹', '鉧', '銧', '鉷', '鉸', '鋧', '鋗', '鋙', '鋐', '﨧', '鋕', '鋠', '鋓', '錥', '錡', '鋻', '﨨', '錞', '鋿', '錝', '錂', '鍰', '鍗', '鎤', '鏆', '鏞', '鏸', '鐱', '鑅', '鑈', '閒', '隆', '﨩', '隝', '隯', '霳', '霻', '靃', '靍', '靏', '靑', '靕', '顗', '顥', '飯', '飼', '餧', '館', '馞', '驎', '髙', '髜', '魵', '魲', '鮏', '鮱', '鮻', '鰀', '鵰', '鵫', '鶴', '鸙', '黑', 'ⅰ', 'ⅱ', 'ⅲ', 'ⅳ', 'ⅴ', 'ⅵ', 'ⅶ', 'ⅷ', 'ⅸ', 'ⅹ', '¦', ''', '"' );
  $replace = array('(1)','(2)','(3)','(4)','(5)','(6)','(7)','(8)','(9)','(10)','(11)','(12)','(13)','(14)','(15)','(16)','(17)','(18)','(19)','(20)','I','II','III','IV','V','VI','VII','VIII','IX','X','ミリ','キロ','センチ','メートル','グラム','トン','アール','ヘクタール','リットル','ワット','カロリー','ドル','セント','パーセント','ミリバール','ページ','mm','cm','km','mg','kg','cc','m2','平成' );
  $result = str_replace($search, $replace, $subject);
  return $result;
}
$test = '①テスト2㍉3日本語のテストです';
$result = replace_kishu_kanji($test);
echo $test;
No.978
11/19 11:18

edit

日本語

PHPから日本語フォントを使ってPDFを生成、出力する【TCPDF】

PHPから動的にPDFを生成し出力やプリントするには古くは【FPDF】を使用しましたが、現在では【TCPDF】を使用します。 TCPDFを利用するメリットは以下のとおり

・文字コード「UTF-8」が使用できる
・TTFフォントを変換しなくても使用できる(自動変換が行われる)

#1. TCPDFのダウンロードと設置 http://sourceforge.net/projects/tcpdf/files/ からダウンロードしてフォルダごとサーバにアップロード

#2. フォント(.ttf)のアップロード 【tcpdf/fonts】の中に【ttf】フォルダを作ってそこにフォントファイルをアップロードします。

#3. TCPDFを使ったPHPからのPDF出力 デフォルトで入っている「Hrlvetica」と自分でアップロードした「IPAゴシック」を使ってPDF出力する例
「IPAゴシック」のフォントファイルは http://ipafont.ipa.go.jp/old/ipafont/download.html からダウンロードし ( ./tcpdf/fonts/ttf/ipaexg.ttf )に置いておきます

require_once('tcpdf/tcpdf.php');
$pdf = new TCPDF("L", "mm", "A4", true, "UTF-8" );
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->AddPage();
$font = new TCPDF_FONTS();
// フォント:helvetica
$font_0 = $font->addTTFfont( 'フォントファイルまでのフルパス/helvetica.php');
$pdf->SetFont($font_0 , '', 32,'',true);
$pdf->Text(0, 0, "alphabetica ABCDEFG" );
// フォント:IPAゴシック
$font_1 = $font->addTTFfont('フォントファイルまでのフルパス/ipaexg.ttf');
$pdf->SetFont($font_1 , '', 32,'',true);
$pdf->Text(0, 15, "美しい日本語のフォントを表示" );
$pdf->Output("cd_cover_template.pdf", "I");
No.967
11/18 14:02

edit

pdf
日本語
画像

日本語(全角文字)を指定文字数で折り返す(word wrap)Smartyプラグイン

ある文章を指定文字数折り返(強制改行)したい時があります。

そんな時に便利なのがSmartyのwordwrapプラグインがありますが、日本語や全角文字には対応していないので使用出来ません。

そこで日本語対応のSmartyプラグイン

■ modifier.unicode_wordwrap

(引用元:http://goo.gl/JmZjK にインデント機能を拡張しました。)

ファイル名 modifier.unicode_wordwrap.php で下記コードを保存し plugins フォルダに格納

<?php
function smarty_modifier_unicode_wordwrap($str, $len=80, $break="\n", $indent='' ){
	$str = str_replace( "\r", $break, str_replace( "\r", "\n", str_replace("\r\n", "\n", $str) ) );
	$str = preg_replace('/(.{'.$len.'})/u', '${1}'.$break, $str);
	if (strcmp($indent,'')==0){ return $str; }
	else{
		$ar  = preg_split("/{$break}/",$str);
		for($i=0 ; $i<count($ar); $i++){
			$ar[$i] = $indent.$ar[$i];
		}
		return join($break, $ar);
	}
}
?>

使い方

下記の例だと($my_text を日本語40文字で折り返して各業の文頭に■を追加)となります。

{$my_text|unicode_wordwrap:40:"\n":"■"}

第1引数 : 文字数(デフォルト値:80)
第2引数 : 改行コード(デフォルト値:¥n)
第3引数 : インデント(デフォルト値:ナシ)

です。

No.873
02/06 16:23

edit

Smarty
日本語

PHP文字コード, HTMLのヘッダのエンコード指定が正しいのに何故か時々文字化けする不具合の対応

なぜか時々文字化けが起きる。。。といった不具合の時は

PHPの最初の方に記述

$encoding = 'UTF-8';     // もしくは EUC-JP  ,  SJIS
ini_set('mbstring.internal_encoding', $encoding );
ini_set('mbstring.script_encoding', $encoding );
ini_set('default_charset', $encoding );

これでなおることがあります。

こちらの方法でも直ることがあります(サーバによる)

.htaccess に下記の記述をしてサーバにアップロード

php_value mbstring.internal_encoding EUC-JP
php_value mbstring.script_encoding EUC-JP
php_value default_charset EUC-JP

参考:http://blog.factree.co.uk/memo/000028.html

No.634
01/08 14:44

edit

日本語
.htaccess

文字列に「ひらがな(全角)」「漢字(全角)」「カタカナ(全角)」「カタカナ(半角)」が使われているか判別する。

文字列に「ひらがな(全角)」「漢字(全角)」「カタカナ(全角)」が使われているかを判別するには次のようにする

PHP5 + UTF-8の場合

mb_regex_encoding('UTF-8');
if ( preg_match('/[一-龠]+/u', $q)  ){ 漢字を含む時の処理 }
if ( preg_match('/[ァ-ヶー]+/u', $q) ){ カタカナを含む時の処理 }
if ( preg_match('/[ぁ-ん]+/u', $q) ){ ひらがなを含む時の処理 }
if ( preg_match('/[ア-ン゙゚]+/u', $q) ){ 半角カタカナを含む時の処理 }

■ 注意1

正規表現のオプション【 /u 】というのが最後にくっついていますが、

これは文字コード UTF-8 で検索を行うときには必ず必要なものです。

忘れないよう注意!


■ 注意2

また上記の例だと「ー」はひらがなとしてマッチしません。

ひらがなにも「ー」を含ませる場合は

if ( preg_match('/[ー-ん]+/u', $q) ){ ひらがなを含む }



仕方なく mb_ereg で実装する場合は下記の通り

mb_regex_encoding('EUC-JP');

if ( mb_ereg('[一-龠]+', $q) ) { 漢字を含む }


Unicode対応 文字コード表

!JP 付録4 日本語文字一覧

http://jprs.jp/doc/rule/saisoku-1-wideusejp-furoku-4.html


ASCII文字コード一覧表

http://www.psl.ne.jp/perl/pdojo00b.html


memo.xight.org - PHPの文字化け - 5つの誤解と5つの対策

http://memo.xight.org/2007-02-14-1



No.473
11/19 14:06

edit

正規表現
日本語

全角カタカナにマッチする正規表現

全角カタカナにマッチする正規表現

preg_match( '/[ァ-ヶ]+/',$text );

参考:Unicode対応文字コード表

http://ash.jp/code/unitbl21.htm

No.304
08/08 14:22

edit

正規表現
日本語

日本語が入った正規表現で検索、置換を行う

日本語が入った正規表現を使って検索、置換を行うには preg_match , preg_replace を使う

その際文字化けが起こってしまうことが多いが、原因は【/】をエスケープし忘れている

ところにあると思うので、【/】はきちんとエスケープしよう。

1 日本語エンコードを指定する

mb_regex_encoding('UTF-8'); // もしくは SJIS, EUC-JP

2 検索する文字( $find_text )と区切り文字(/)はあらかじめエスケープしておく

$find_text = preg_quote($find_text, '/');

3 正規表現を使って置換を行う

$string=preg_replace("/($find_text)/", "置換する文字列",$string );

これで文字化けもおこらないと思います。

エンコードUTF-8で日本語を使う場合は u オプションを使用します

$string=preg_replace("/($find_text)/u", "置換する文字列",$string );
No.287
02/09 16:10

edit

正規表現
日本語

PHPで日本語を扱うための設定をする mb_string

phpinfo()で【mbstring.language】の項目を見てみる

デフォルトでは【neutral】になっているので mb_string関連関数が動作しない

そこで実行するPHPスクリプトの先頭の方で以下の関数を実行する

mb_language( "ja");
mb_internal_encoding( "UTF-8"); // もしくは EUC-JP(PHPを記述している文字コードを指定)

尚php.iniの設定は

output_buffering              = Off

(PHPを記述している文字コードと出力文字コードが違う場合は on にする必要があるが、

文字コード変換はframworkで行うのが望ましいのでとりあえずoffでいい)

No.215
08/12 10:17

edit

日本語