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

水沼寛喜 mizunuma @ m-design.com
2005年 11月 13日 (日) 15:09:15 JST


お世話になっております。水沼です。

おく様、お返事を頂きありがとうございました。

期待通りの動作を致しました。
大変ありがとうございます。

別のタイトルのがよろしいのかもしれませんが、
また、正規表現によるものなので、ご教授頂きたいのですが、
正規表現によるパターンマッチでマッチした文字列を配列にて
取り出す方法はありますでしょうか?

●期待したい動作内容
HTMLのテキストエリアに以下のようなパターンマッチが含まれる
文字列を入力して送信。

・パターマッチ内容
「(」文字が2つと「)」文字2つに囲まれている文字のみ変換
例:((あいうえお))


・上記の様なパターンマッチの仕様で以下のようなテストデータを作成
((晴れ))
はれ
((雨))
あめ
((曇り))
くもり
((プリンタ))
ぷりんた
((カラープリンタ))
からーぷりんた

 
・期待する結果
※結果の配列変数を仮に$arrayとする。

$array[0] = 晴れ
$array[1] = 雨
$array[2] = 曇り
$array[3] = プリンタ
$array[2] = カラープリンタ


●現在までの自分で試行錯誤して作成したソースコード
<?
function test($str){
	mb_regex_encoding("UTF-8");
	mb_ereg_search_init("$str", "((\(){2})(.*?)((\)){2})");
	$array = mb_ereg_search_regs("((\(){2})(.*?)((\)){2})");
	print_r($array);
}
?>

・結果
Array ( [0] => ((晴れ)) [1] => (( [2] => ( [3] => 晴れ [4] => )) [5] => ) )

※晴れのみの配列結果しか得られない

ご教授の程、よろしくお願い致します。



> -----Original Message-----
> From: php-users-bounces @ php.gr.jp
> [mailto:php-users-bounces @ php.gr.jp] On Behalf Of okuyama @ workgroup
> Sent: Thursday, November 10, 2005 7:33 PM
> To: 'PHP-users ML'
> Subject: [PHP-users 27459] Re:正規表現について
>
>
> おく@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 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 メーリングリストの案内