[PHP-users 31455] Re: 特定の文字列に囲まれていないキーワードを置き換える方法

YuGo yu.gotou @ gtec-ni.com
2007年 2月 13日 (火) 19:41:52 JST


またまたこんにちは。
しからば、これはどうでしょう。
タグの属性でないhogeは!hit!に置き換える。
<a></a>にはさまれた!hit!だけはhogeに戻す。

$str = 'KUhogeEK<a href="hogeUM">PhogeSS</a><div>hogeDE</div><img
src="#" alt="ShogeS" />Dhoge' ;
$pattern = '/([^<]*)(hoge)([^>]*)/' ;
$replace = '$1!hit!$3' ;
$pattern1 = '/(<a href=.*>.*)(!hit!)(.*<\/a>)/' ;
$replace1 = '$1hoge$3' ;

 $str1 = preg_replace ($pattern ,$replace ,$str) ;
echo preg_replace ($pattern1 ,$replace1 ,$str1) ;






江頭 竜二 wrote:
> こんにちは
> 
> YuGo様、大原様、アドバイスありがとうございます。
> 本物のhtmlはわけあって出せないんですが、今度からもっと
> 具体的なものを提示するよう心がけますm( _ _ )m
> 
> 今回、YuGo様の例でお話させて頂きますと、
> 
> $str = '<a href="hogeum">phogessd</a><img src="#" alt="shoges" />hoge' ;
> $pattern = '/([^<]*)(hoge)([^>]*)/' ;
> $replace = '$1<a href="./hit.html">hit</a>$3' ;
> echo preg_replace ($pattern,$replace,$str) ;
> 
> 上記スクリプトを実行すると、アンカータグに囲まれた「phogessd」まで
> 置き換えられてしまいます。
> そうしますと、アンカータグの開始タグと終了タグのなかに、
> またアンカータグが入ってしまう事になり、アンカータグの入れ子状態に
> なってしまいます。
> 「phogessd」は置き換えせず、行末の「hoge」だけを置き換える方法はないで
> しょうか?
> 「否定先読み?」などを使う必要があるのではないかと思っているのですが、
> 色々なサイトで調べてみても、どうしても理解できず困っています。
> 
> どうか宜しくお願い致します。
> 


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