[PHP-users 27604] Re: 正規表現についてご教授の程、よろしくお願いします。

okuyama@workgroup okuyama @ workgroup.jp
2005年 11月 24日 (木) 22:44:43 JST


おく@Workgroupです。

<?php
class regexReplace {
	var $str;
	var $regex;
	var $replace;

	function regexReplace($str = null) {
		$this->str = $str;
	}

	function setString($str) {
		$this->str = $str;
	}
	function addPatern($strings, $replaceUri) {
		$this->regex[] = sprintf(

"/(%s)(?=(?:(?!<\s*?\/\s*?a\s*?>).)*(?:<\s*?a(?:>|\s[^>]+>)|$))/is"
			, $strings);
		$this->replace[] = sprintf(
			"<a href=\"%s\">$1</a>"
			, $replaceUri);
	}
	function get() {
		return preg_replace($this->regex, $this->replace,
$this->str);
	}
}


$str = 'テスト<a href="http://www.yahoo.co.jp">yahoo</a>
yahooです。< a
href = \"http://www.yahoo.co.jp/\" > yahoo
 < / a >かも
。yahoo です <a href=\"http://www.excite.co.jp\">
    excite
    <
    /
a
>かな? test excite です';

$repl = new regexReplace($str);

$repl->addPatern("yahoo", "http://www.yahoo.co.jp/");
$repl->addPatern("excite", "http://www.excite.co.jp/");

$out = $repl->get();

echo "$out\n";

?>
ミワさまのを少しいじると、かなり意地悪なHTMLでもOKですね。
置き換え部分をクラス化しておくと、もっと汎用的な部品になります。

.    ・ . +  : ゜.  ‥   ゜. .
 ‥   ゜. .  .  ・.    ・ . +
  /  +   ゜.     ・ . +  :
★               from: Atsuji Okuyama
  彡彡ミ
 )∂∂b        mail:  okuyama @ workgroup.jp
 ( ー  人__     tel: 050-3599-1875
   ̄/)/   |     tel: 050-7567-2016
   |` ̄    "\  au : 090-3545-9553


> -----Original Message-----
> From: php-users-bounces @ php.gr.jp
> [mailto:php-users-bounces @ php.gr.jp] On Behalf Of Eiji Miwa
> Sent: Thursday, November 24, 2005 9:13 PM
> To: PHP-users ML
> Subject: [PHP-users 27602] Re: 正規表現についてご教授の程、よろしくお願い
します。
>
>
>  ミワです。
>
> On 2005年 11月 24日 , at 10:34, 水沼寛喜 wrote:
> >
> > ●想定をしている動作環境
> >
> >  ・送信文字列
> >   テスト<a href="http://www.yahoo.co.jp">yahoo</a>
> >   yahooです。
> >
> >   ・置換処理後の想定している結果
> >   テスト<a href="http://www.yahoo.co.jp">yahoo</a>
> >   <a href="http://hoge.hoge">yahoo</a>です。
> >
> > 1行目の「yahoo」というURLとURLリンクに記述
> > されている文字には
> > 反応しないで、2行目の「yahoo」という文字に正規表現によ
> > る置換処理
> > を行いたい。
>
>  こんなのでどうでしょう?
> ---
> 	$string = 'テスト<a href="http://www.yahoo.co.jp">yahoo!</
> a><br>テストyahooです。';
> 	$keyword = 'yahoo';
> 	$pattern =
> sprintf('/(%s)(?=(?:(?!<\/a>).)*(?:<a(?:>|\s[^>]+>)|$))/
> is',$keyword);
> 	$replacement = '<a href="http://hoge.hoge">$1</a>';
> 	var_dump(preg_replace($pattern,$replacement,$string));
> ---
>  アンカーの閉じタグで判断してます。
>
> --
>  miwa at offside.ne.jp
>
>
>
> _______________________________________________
> 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 メーリングリストの案内