[PHP-users 27459] Re: 正規表現について

okuyama@workgroup okuyama @ workgroup.jp
2005年 11月 10日 (木) 19:32:41 JST


おく@Workgroupです。

コードを整理してみました。

同種類のタグが入れ子になることは、無いはずですので、
問題は無いのでは?

<?php
function convert($str) {
	$enc = mb_detect_encoding($str, "JIS,EUC-JP,SJIS,UTF-8");
	if ($enc != "EUC-JP") {
		$str = mb_convert_encoding($str, "EUC-JP", $enc);
	}

	//URLアドレス
	$str = preg_replace(
		"/\[(https{0,1}:.+?):(.+?)\]/s",
		"<a href=\"$1\" target=\"_blank\">$2</a>", $str);
	//アンダーライン
	$str = preg_replace(
		"/\[{3}(.+?)\]{3}/s",
		"<u>$1</u>", $str);
	//文字サイズ
	$str = preg_replace(
		"/\[{2}(.+?)\]{2}/s",
		"<font size=\"4\">$1</font>", $str);
	//ボールド
	$str = preg_replace(
		"/<{3}(.+?)>{3}/s",
		"<b>$1</b>", $str);
	//イタリック
	$str = preg_replace(
		"/<{2}(.+?)>{2}/s",
		"<i>$1</i>", $str);
	$str = mb_convert_encoding($str, $enc, "EUC-JP");
	return $str;
}

$str = '
[[アイ[[[ウエオ]]]カキ<<クケコ>>アイウエオ]]<<""\\"">><<あいうえお>><<<あいう
えお>>>[[[あいうえお]]][[あいうえお]][http://www.yahoo.co.jp:あいう
えお]てすと[https://www.yahoo.co.jp:あいう
えお]

<<あいうえお>><<かきくけこ>>[[[挨拶]]][[[竜]]][[[龍]]][[かきくけこ]][[たちつ
てと]][[""\\""]]
';

echo "$str\n\n";
echo convert($str) . "\n";

?>

結果:
<font size="4">アイ<u>ウエオ</u>カキ<i>クケコ</i>アイウエオ</font><i>""\""</i><i>あい
うえお</i><b>あいう
えお</b><u>あいうえお</u><font size="4">あいうえお</font><a
href="http://www.yahoo.co.jp" target="_blank">あいう
えお</a>てすと<a href="https://www.yahoo.co.jp" target="_blank">あいう
えお</a>

<i>あいうえお</i><i>かきくけこ</i><u>挨拶</u><u>竜</u><u>龍</u><font
size="4">かきくけこ</font><font size="4">たちつてと</font><font
size="4">""\""</font>

タグ内での改行にも対応しています。

> -----Original Message-----
> From: php-users-bounces @ php.gr.jp
> [mailto:php-users-bounces @ php.gr.jp] On Behalf Of 水沼寛喜
> Sent: Thursday, November 10, 2005 6:35 PM
> To: 'PHP-users ML'
> Subject: [PHP-users 27458] Re:正規表現について
>
> お世話になっております。水沼です。
>
> nomoto様、お返事頂きありがとうございます。
>
> mb(マルチバイト関数)使用時のmb_ereg_replace関数の(\w)*は、英数字と日本語
に
>> 対応しているのを確認済みです。
>
> また、mb_ereg_replace関数使用時に、マッチング処理が
> 問題になる点について、ご指摘頂きありがとうございます。
>
> 検討してみます。
>
> > -----Original Message-----
> > From: php-users-bounces @ php.gr.jp
> > [mailto:php-users-bounces @ php.gr.jp] On Behalf Of nomoto
> > Sent: Thursday, November 10, 2005 6:24 PM
> > To: PHP-users ML
> > Subject: [PHP-users 27456] Re:正規表現について
> >
> >
> >   nomotoです。
> >
> > >まつやま様ののソースコードで開発していこうと現在考えておりますが、
> > >以下の様なテスト文字を作成して試したところ、英数字と記号を使用した場
合、
> > >うまく変換されないのですがどの様にしたらよろしいでしょうか?
> >
> > 開始終了で囲まれた文字列の抜き出し(パース)は単純な正規表現では
> > フォーローしきれない問題が出てきます。
> >
> > (\w*)は([a-zA-Z0-9_]*)と同じなので[[abcdefgh]]ではマッチしますが
> > 日本語や空白や記号が入ったらマッチしません。
> >
> > (.*)はどんな文字であっても最大長でマッチするので、日本語が
> > 入っていてもOKですが [[テスト]]で[[す]] などにマッチさせた場合
> > に、もっとも長くなる テスト]]で[[す という文字列にマッチします。
> >
> > (.+?)と?をつけると一番短くマッチするので、 [[テスト]]で[[す]]
> > という文字は テスト の部分にマッチするので一番目的に近いように
> > 思えますが、この場合でも、 [[テスト[[なん]]です]] とタグが
> > 入れ子になっていると テスト[[なん の部分でマッチしてしまうので
> > うまく行かないでしょうね。
> >
> > パース処理については、先頭からループ処理を駆使して開始タグが
> > 何回出てきたか、終了タグが何回でてきたか、現在入れ子が何階層目
> > なのか、などを順番に処理しないと正確には処理できません。
> >
> > 大変ですが良いサンプルがあるといいですね。頑張ってください。
> >
> >
> > _______________________________________________
> > PHP-users mailing list  PHP-users @ php.gr.jp
> > http://ns1.php.gr.jp/mailman/listinfo/php-users
> > PHP初心者のためのページ - 質問する前にはこちらをお読みください
> > http://www.php.gr.jp/php/novice.php3
> >
>
>
> _______________________________________________
> PHP-users mailing list  PHP-users @ php.gr.jp
> http://ns1.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://www.php.gr.jp/php/novice.php3
>
>



PHP-users メーリングリストの案内