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

okuyama@workgroup okuyama @ workgroup.jp
2005年 11月 13日 (日) 18:06:03 JST


 おく@Workgroupです。

preg_replace_callback 関数で、ユーザ関数を適用することが可能です。

<?php


function url_convert($matches) {
	return sprintf("<a href=\"test.php?test=%s\">%s</a>",
urlencode(mb_convert_encoding($matches[1],"UTF-8","EUC-JP")), $matches[1]);
}
function convert_url($str) {
	$enc = mb_detect_encoding($str, "auto");
	if ($enc != "EUC-JP") {
		$str = mb_convert_encoding($str, "EUC-JP", $enc);
	}
	$str = preg_replace_callback("/\({3}(.+?)\){3}/", "url_convert",
$str );
	$str = mb_convert_encoding($str, $enc, "EUC-JP");
	return $str;
}

$str = '
(((ああああ)))
(((いいいい)))
(((うううう)))
';
echo "$str\n\n";
var_dump( convert_url($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 5:03 PM
> To: 'PHP-users ML'
> Subject: [PHP-users 27483] Re:正規表現について
>
> お世話になっております。水沼です。
>
> 正規表現のpreg_replace関数またはmb_ereg_replacを使用した場合、
> 置換処理時に、関数を通す事は不可能なのでしょうか?
>
> ●期待したい動作内容
> おく様などからご教授頂いた、ソースコードを使用して以下のような
> 関数を通そうと考えています。
>
> ●テストコード
> $str = preg_replace("/\({3}(.+?)\){3}/s", "<a
> href=\"test.php?test=".urlencode($1)."\">$1</a>", $str);
>
> 期待した結果
> <a href="test.php?keyword=URLエンコードされた文字列">URLエンコードされる前
の
> 文字列</a>
>
> ご教授の程、よろしくお願い致します。
>
>
> > -----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:57 PM
> > To: 'PHP-users ML'
> > Subject: [PHP-users 27482] Re:正規表現について
> >
> >
> > お世話になっております。水沼です。
> >
> > おく様、またまたお返事を頂きありがとうございます。
> >
> > ちょうど、自分でも同じ関数を発見して実装テストを行っていたところでした。
> > PHPは正規表現の関数が豊富(?)な為、なかなか難しいところですね。
> > 正規表現のパターンを作るのたけで、苦手な為相当時間が掛かって大変なのに^
> ^;
> >
> > おく様色々とありがとうございました。
> >
> > 自分で作成したソースコードは以下の通りです。
> > <?
> > preg_match_all("/\({2}(.+?)\){2}/s", $str, $arr_keyword);
> > print_r(#arr_keyword); for($i=0; $i<count($arr_keyword[1]); $i++){
> > 	$keyword = $arr_keyword[1][$i];
> >
> > 	//色々と処理内容を書く・・・・
> >
> > }
> > ?>
> >
> >
> > > -----Original Message-----
> > > From: php-users-bounces @ php.gr.jp
> > [mailto:php-users-bounces @ php.gr.jp]
> > > On Behalf Of okuyama @ workgroup
> > > Sent: Sunday, November 13, 2005 3:48 PM
> > > To: 'PHP-users ML'
> > > Subject: [PHP-users 27481] Re:正規表現について
> > >
> > >
> > > おく@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 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 メーリングリストの案内