SQLの窓 イラストAC フリー素材

2006年12月23日

WEB上でPHPの正規表現による文字列取得

ここから実行
※ テキストエリアに改行無しでURLを記述すると、そこから文字列を取得

<?
require_once( "./mwin.php" );

mb_language( "ja" );
mb_internal_encoding("EUC-JP");

foreach( $_POST as $Key => $Value ) {
	$_POST[$Key] = str_replace("\\\\", "\\", $Value );
	$_POST[$Key] = str_replace("\\'", "'", $_POST[$Key] );
	$_POST[$Key] = str_replace("\\\"", "\"", $_POST[$Key] );
}
$_GET = $_POST;
?>

<HTML>
<HEAD>
<META http-equiv="Content-type" content="text/html; charset=euc-jp">
<TITLE>PHP 雛形</TITLE>
<LINK rel="stylesheet" type="text/css" href="style.css">
<STYLE type="text/css">
</STYLE>
</HEAD>
<BODY id="body" style='background-color:white'>

<?

if ( trim( $_GET['text'] ) == '' ) {
	print "対象データを入力して下さい";
	exit();
}
if ( trim( $_GET['pattern'] ) == '' ) {
	print "パターンを入力して下さい";
	exit();
}

if ( substr( $_GET['text'], 0, 4 ) == 'http' ) {
	$ret = @file_get_contents( $_GET['text'] );
	if ( $ret !== FALSE ) {
		$enc = mb_detect_encoding($ret, "SJIS,UTF-8,EUC-JP");
		if ( $enc == 'SJIS' || $enc == 'UTF-8' ) {
			$ret = mb_convert_encoding ( $ret, "EUC-JP", $enc );
		}
		$_GET['text'] = $ret;
	}
}

mb_ereg_search_init( $_GET['text'], $_GET['pattern'], "i" );
while( TRUE === mb_ereg_search() ) {
	$work = mb_ereg_search_getregs();
	$ncnt = 0;
	foreach( $work as $Key => $Value ) {
		$Value = mb_ereg_replace( "&", "&amp;", $Value );
		$Value = mb_ereg_replace( "<", "&lt;", $Value );
		$matches[$ncnt][] = mb_ereg_replace( ">", "&gt;", $Value );
		$ncnt++;
	}
}

print "<pre>";
print "<span style='color:blue'>[0] は、マッチした全体の文字列を指す</span>\n";
print "<span style='color:blue'>それ以外は () によってマッチした部分文字列</span>\n";
print_r($matches);
print "</pre>";

?>

</BODY>
</HTML>
posted by at 2006-12-23 19:46 | PHP | このブログの読者になる | 更新情報をチェックする

2006年12月22日

XMLファイルの書き換え(Perl:XML::DOM)

Perl は得意ではありませんが・・・
特に utf-8 の扱いは頭が痛いです。


#!/usr/local/bin/perl

print "Content-Type: text/html; Charset=utf-8\n";
print "\n";
print "Done";

use XML::DOM;
use Encode;
use encoding 'utf-8';

# DOM Object 作成
$parser = new XML::DOM::Parser;
$dom = $parser->parsefile("index.xml");

# 既存のノード( channel ) を取得
my $nodeList = $dom->getElementsByTagName("channel");

# 新規ノードを作成
my $node = $dom->createElement("item");

# **********************************************************
# title ノードを作成
# **********************************************************
my $nodeChild = $dom->createElement("title");
# テキストノードを作成して title ノードに追加
$nodeChild->appendChild( $dom->createTextNode( "これは" ) );
# item ノードに titile ノードを追加
$node->appendChild( $nodeChild );

my $nodeChild = $dom->createElement("link");
$nodeChild->appendChild( $dom->createTextNode( "全て" ) );
$node->appendChild( $nodeChild );

my $nodeChild = $dom->createElement("description");
$nodeChild->appendChild( $dom->createTextNode( "utf-8の世界です" ) );
$node->appendChild( $nodeChild );

my $nodeChild = $dom->createElement("dc:subject");
$nodeChild->appendChild( $dom->createTextNode( "ソースコードも" ) );
$node->appendChild( $nodeChild );

my $nodeChild = $dom->createElement("dc:date");
$nodeChild->appendChild( $dom->createTextNode( "utf-8n です" ) );
$node->appendChild( $nodeChild );

my $targetNode = $nodeList->item( 0 );
$targetNode->appendChild( $node );

# 保存
$dom->printToFile("data.xml");

#print $dom->toString;

$dom->dispose;
posted by at 2006-12-22 18:12 | その他 | このブログの読者になる | 更新情報をチェックする

XMLファイルの書き換え(PHP5:DOMFunctions)

より、オブジェクト処理として完成されてますね

<?

mb_language( "ja" );
mb_internal_encoding("UTF-8");

# DOM Object 作成
$dom = DOMDocument::load("index.xml");

# 既存のノード( channel ) を取得
$nodeList = $dom->getElementsByTagName("channel");

# 新規ノードを作成( createElement でも良い )
$node = $dom->createElement("item");

# **********************************************************
# title ノードを作成
# **********************************************************
$nodeChild = $dom->createElement("title");
# テキストノードを作成して title ノードに追加
$utf8 = mb_convert_encoding ( "これは", "UTF-8", "SJIS" );
$nodeChild->appendChild( $dom->createTextNode( $utf8 ) );
# item ノードに titile ノードを追加
$node->appendChild( $nodeChild );

# **********************************************************
# link ノードを作成
# テキストノード同時作成の createElement を使用
# **********************************************************
$utf8 = mb_convert_encoding ( "UTF-8 ですが", "UTF-8", "SJIS" );
# テキストノード同時作成する link ノードの作成
$nodeChild = $dom->createElement("link", $utf8 );
$node->appendChild( $nodeChild );

# **********************************************************
# description ノードを作成
# **********************************************************
$utf8 = mb_convert_encoding ( "SHIFT_JISを", "UTF-8", "SJIS" );
$nodeChild = $dom->createElement("description", $utf8 );
$node->appendChild( $nodeChild );

# **********************************************************
# dc:subject ノードを作成
# **********************************************************
$utf8 = mb_convert_encoding ( "自力で", "UTF-8", "SJIS" );
$nodeChild = $dom->createElement("dc:subject", $utf8 );
$node->appendChild( $nodeChild );

# **********************************************************
# dc:date ノードを作成
# **********************************************************
$utf8 = mb_convert_encoding ( "変換しています", "UTF-8", "SJIS" );
$nodeChild = $dom->createElement("dc:date", $utf8 );
$node->appendChild( $nodeChild );


# channel ノードは、一つしか無いので、nodeList(0) で参照
# channel ノードの下に item ノードを追加
$targetNode = $nodeList->item( 0 );
$targetNode->appendChild( $node );

# 保存
$dom->save( "data.xml" );

#<channel>
#	<item>
#		<title>aaaaa</title> 
# 		<link>bbbbb</link> 
# 		<description>ccccc</description> 
#		<dc:subject>ddddd</dc:subject> 
#		<dc:date>eeeee</dc:date> 
#	</item>
#		<---- ここに追加
#</channel>

?>
Done



posted by at 2006-12-22 14:27 | PHP | このブログの読者になる | 更新情報をチェックする

2006年12月02日

リコンパイルPHPマニュアル

現在は文字化けしなくなっています。

PHP の chm マニュアルが文字化けしなくなっています(現在2014/4/11ビルド)が、トップページは出ません
▼▼▼▼ 古い記事です ↓リコンパイルしたもの オリジナル chm ↓は、日本語が化けてるので http://www.php.net/download-docs.php 自分でしたい場合は、オリジナルをまず、ダウンロード後、cmd.exe からダウンロードファイルをカレントにしてhh -decompile . php_manual_ja.chm を実行して下さい( php_manual_ja.hhc と php_manual_ja.hhk が作成されます ) Microsoft HTML Help Downloadsより、HTML Help Workshop をダウンロードしてインストール( Htmlhelp.exe で、コンパイラと英文マニュアル、Htmlhelpj.exe で日本語マニュアルのみ ) php_manual_ja.hhc と php_manual_ja.hhk より php.hhp ( プロジェクト )を作成し、いろいろオプションを付けてコンパイル。 とりあえず、php.hhp をリネームして内容を変更してオリジナルの chm を作ってみると良いでしょう。 ( プロジェクトバーの FD アイコンで保存して、ファイルメニューから Compile )
posted by at 2006-12-02 22:42 | PHP | このブログの読者になる | 更新情報をチェックする

2006年12月01日

PEARのMailパッケージによるメール送信

ほんとに pear.bat でインストールするとろくな事が無いです。今回、偶然以前に動くコードで試していたので事なきを得ましたが、でなきゃ、こんな原因解るわけ無いです

code: 535, response: 5.7.0 authentication failed
▼ その事情と実行可能なコードサンプル
<?php
set_include_path( "C:\php\PEAR" );
include('Mail.php');
include('Mail/mime.php');

# 内部コード指定
mb_language( "ja" );
mb_internal_encoding("UTF-8");

# メール送信環境
$mailServer = "localhost";
$mailPort = 25;
$mailFrom = "lightbox@localhost";
$mailTo = "lightbox@localhost";
$mailUser = "lightbox";
$mailAuth = true;	// true 認証有り、false 認証無し
$mailPass = "password";

print "<PRE>";

# **********************************************************
# 本文( テキスト )
# 30 文字程度で改行を入れて下さい
# **********************************************************
$text = mb_convert_encoding("日本語\n日本語", "JIS", "SJIS" );

# **********************************************************
# 本文( HTML )
# **********************************************************
$html = "<html><body><pre>$text</pre></body></html>";

# **********************************************************
# 添付ファイル( 必要ならば、$file にセットする )
# **********************************************************
#$file = './Book1.xls';
$crlf = "\n";

# **********************************************************
# FROM と TO を設定
# **********************************************************
$from    = mb_convert_encoding( "送信者", "JIS", "SJIS" );
$from    = "=?ISO-2022-JP?B?" . base64_encode($from) . "?= <$mailFrom>";
$to      = mb_convert_encoding( "宛先", "JIS", "SJIS" );
$to      = "=?ISO-2022-JP?B?" . base64_encode($to) . "?= <$mailTo>";

# **********************************************************
# ● 長い件名の処理
# **********************************************************
$subject = "改行する必要のある長い日本語を";
$subject .= "件名にセットしてテストしてみましょう。";
$subject .= "件名に「AあBいC」のように半角が交互に含まれると";
$subject .= "エンコード後の長さが増加するので、";
$subject .= "改行長は短めに設定しています。";

// SJIS として文字数を取得
$len = mb_strlen( $subject, "SJIS" );
// 10 文字以下ならそのまま処理
if ( $len <= 10 ) {
	$subject = mb_convert_encoding( $subject, "JIS", "SJIS" );
	// mime encode
	$sub_str = "=?ISO-2022-JP?B?" . base64_encode($subject) . "?=";
}
// 10 文字以上なら分解して処理
else {
	// 先頭から10文字取得
	$sub_str = mb_substr( $subject, 0, 10, "SJIS" );
	// JIS に変更
	$sub_str = mb_convert_encoding( $sub_str, "JIS", "SJIS" );
	// mime encode
	$sub_str = "=?ISO-2022-JP?B?" . base64_encode($sub_str) . "?=";
	// 次の処理の為に処理済みの文字列を削除
	$sub_work = mb_substr(
		$subject, 10, mb_strlen( $subject,"SJIS" ) - 10, "SJIS" );
	// 処理文字列が存在する間続ける
	while( 1 ) {
		// 改行とスペース
		$sub_str .= "\r\n ";
		// まだ 10 文字より長い場合
		if ( mb_strlen( $sub_work, "SJIS" ) > 10 ) {
			// 先頭から10文字取得
			$sub_left = mb_substr( $sub_work, 0, 10, "SJIS" );
			// JIS に変更
			$sub_left = mb_convert_encoding( $sub_left, "JIS", "SJIS" );
			// mime encode して追加
			$sub_str .=
				"=?ISO-2022-JP?B?" . 
				base64_encode($sub_left) . 
				"?=";
			// 次の処理の為に処理済みの文字列を削除
			$sub_work = mb_substr(
				$sub_work,
				10,
				mb_strlen( $sub_work, "SJIS" ) - 10,
				"SJIS"
			);
		}
		// 10 文字以内の場合
		else {
			// JIS に変更
			$sub_work = mb_convert_encoding( $sub_work, "JIS", "SJIS" );
			// mime encode
			$sub_str .=
				"=?ISO-2022-JP?B?" . 
				base64_encode($sub_work) . 
				"?=";
			// 終了
			break;
		}
	}
}
// 出来上がった文字列を件名として使用する
$subject = $sub_str;

# **********************************************************
# ● 準備された情報を元に、SMTP に渡す MIME 情報を
#    作成する
# **********************************************************
$mime = new Mail_mime($crlf);

# 本文( テキスト )
$mime->setTXTBody($text);
# 本文( HTML )
$mime->setHTMLBody($html);
# 添付ファイル
if ( $file != "" ) {
	$mime->addAttachment($file, 'application/octet-stream');
}
# パーツ別のキャラクタセット指定
$param = 
	array(
		'text_charset' => 'ISO-2022-JP',
		'html_charset' => 'ISO-2022-JP'
	);
# **********************************************************
# ヘッダと本文の作成
# **********************************************************
// ヘッダ情報の整理
$hdrs = 
	array(
		'Date' => date("r"),
		'From'    => $from,
		'To'    => $to,
		'Subject' => $subject
	);

$body = $mime->get( $param );
$hdrs = $mime->headers($hdrs);

# **********************************************************
# SMTP 環境の情報
# **********************************************************
if ( $mailAuth ) {
	$smtp = 
		array(
			'host' => $mailServer,
			'port' => $mailPort,
			'auth' => TRUE,
			'username' => $mailUser,
			'password' => $mailPass,
		);
}
else {
	# 以下は認証なし
	$smtp = 
		array(
			'host' => $mailServer,
			'port' => $mailPort,
			'auth' => FALSE,
			'username' => '',
			'password' => '',
		);
}

# メールオブジェクトを作成
$mail =& Mail::factory('smtp', $smtp );

# **********************************************************
# ● メール送信( ヘッダと本文 を引数として渡す )
# **********************************************************
$ret = $mail->send($mailTo, $hdrs, $body);
if ( $ret !== true ) {
	print $ret->getMessage() . "<br>";
}

print "</PRE>";
?>
Done



posted by at 2006-12-01 17:10 | PHP+Pear | このブログの読者になる | 更新情報をチェックする

PEARで簡易メール受信

モジュールでは、IMAP、POP3 および NNTP 関数 というのがありますが、レンタルサーバー側でインストールされる事は無いと思われるので、PEAR で実装する事になると思います。

▼ サンプルコード
<?php
# PEAR
require_once('Net/POP3.php');

# 漢字変換用( 内部コード設定 );
mb_language( "ja" );
mb_internal_encoding("EUC-JP");

print "<PRE>";

# インスタンス作成
$pop3 = new Net_POP3();

# 接続( さくらインターネットの場合 )
$ret = $pop3->connect ("ユーザid.sakura.ne.jp", 110 );
if ( $ret ) {
	print "接続OK\n";
}

# ログイン ( APOP )
$ret = $pop3->login( "メールid@ユーザid.sakura.ne.jp", "パスワード", true );
if ( $ret ) {
	print "ログインOK\n";
}

# メッセージの総件数
$ret = $pop3->numMsg();
print "$ret : メッセージ件数\n";

# メッセージの総サイズ
$ret = $pop3->getSize();
print "$ret : メールボックスのサイズ\n";

# メッセージの一覧
$ret = $pop3->getListing();
$i = 1;
if ( $ret !== false ) {
	foreach( $ret as $Key => $Value ) {

		# msg_id、size、uidl の表示
		print "$Key : $Value\n";
		foreach( $Value as $Key2 => $Value2 ) {
			print "\t$Key2 : $Value2\n";
		}

		# ヘッダ情報の表示
		$ret2 = $pop3->getParsedHeaders( $i );
		foreach( $ret2 as $Key2 => $Value2 ) {
			print "\t\t$Key2 : $Value2\n";
		}

		# 本文の表示
		$ret2 = $pop3->getBody( $i );
		print $ret2 . "\n";
		$i++;
	}
}

# 先頭メッセージの本文を Shift_JIS に変換して表示
$ret = $pop3->getBody( 1 );
print mb_convert_encoding( $ret, "SJIS", "JIS" );

# 接続解除
$pop3->disconnect();

print "</PRE>";
?>



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

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

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

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

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


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

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

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

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

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