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

okuyama@workgroup okuyama @ workgroup.jp
2005年 11月 13日 (日) 15:47:58 JST


おく@Workgroupです。

> 正規表現によるパターンマッチでマッチした文字列を配列にて
> 取り出す方法はありますでしょうか?

preg_match_all が、その通りの動作をする関数です。

<?php
function conv_encording($str, $enc_to, $enc_from) {
	if (is_array($str)) {
		while (list($key,$value) = each($str)) {
			$str[$key] = conv_encording($value, $enc_to,
$enc_from);
		}
		return $str;
	}
	return mb_convert_encoding($str, $enc_to, $enc_from);
}

function search($str) {
	$enc = mb_detect_encoding($str, "auto");
	if ($enc != "EUC-JP") {
		$str = mb_convert_encoding($str, "EUC-JP", $enc);
	}
	preg_match_all ( "/\({2}(.+?)\){2}/", $str, $matches,
PREG_PATTERN_ORDER );
	$ret = $matches[1];
	$ret =  conv_encording($ret, $enc, "EUC-JP");
	return $ret;
}

$str = '((晴れ))
はれ
((雨))
あめ
((曇り))
くもり
((プリンタ))
ぷりんた
((カラープリンタ))
からーぷりんた
';

echo "$str\n\n";
var_dump( search($str)) . "\n";

?>

こんな感じで、期待の動作になるのではないでしょうか?
変換しつつであれば、前回の関数に組み込む形になるかと思います。


> -----Original Message-----
> From: php-users-bounces @ php.gr.jp
> [mailto:php-users-bounces @ php.gr.jp] On Behalf Of 水沼寛喜
> Sent: Sunday, November 13, 2005 3:09 PM
> To: 'PHP-users ML'
> Subject: [PHP-users 27480] Re:正規表現について
>
> お世話になっております。水沼です。
>
> おく様、お返事を頂きありがとうございました。
>
> 期待通りの動作を致しました。
> 大変ありがとうございます。
>
> 別のタイトルのがよろしいのかもしれませんが、
> また、正規表現によるものなので、ご教授頂きたいのですが、
> 正規表現によるパターンマッチでマッチした文字列を配列にて
> 取り出す方法はありますでしょうか?
>
> ●期待したい動作内容
> 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 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 メーリングリストの案内