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

江頭 竜二 ryu-ring.woo @ cap.ocn.ne.jp
2007年 2月 14日 (水) 21:57:41 JST


お世話になっております。江頭と申します。

先ほど、出張より戻り、たくさんのアドバイスを頂いておりびっくりしていました。
YuGo様、大原様、聖様、おく@Workgroup様、Mashiki様
本当にありがとうございました。

結論としまして。問題は解決しました。

みなさんのアドバイスを参考に思考錯誤させて頂きました。
「titleタグ」や「h*タグ」も無視させる等、他にも解決せねばならぬ
問題があり、聖様のアイデアのような汎用性があるもの
がよかったのですが、納期と処理速度の問題もあり、
大原様のアイデアをちょっとだけ調整し対応する事にしました。
(実は、1ページの表示につき、100近くのキーワードを
置き換え処理させなければなりませんでしたので。。。)

汎用性のあるものを作る余裕がなかったので、
まず、htmlの作りこみに前提条件をつけました。

◆ 「pタグ」内の文章のみを検索対象とする。
◆ 「pタグ」内には「h*」タグは入れない
ここまでは、htmlの文章構造としてまだツジツマがあいます。

という事で、スクリプトは以下のようにしました。

$html= <<<__EOF__
<html>
<head>
<title>hoge</title>
<meta name="Descritpion" Content="hogegegehoge" />
</head>
<body>
<p class="hoge">moge hoge<a href="hoge.html"
title="hoge">hoge</a>...</p>
<p class="hoge"><img src="hoge.jpg" alt="hoge moge" /> hohogegehoge.</p>
</body>
</html>
__EOF__;

$reg = '|<p>(.*?)</p>|s';

echo preg_replace_callback( $reg, 'doSomething1', $html);

function doSomething1( $matches ) {
$reg = '|>(?:((?!>).)*)<(?!/a)|s';
return preg_replace_callback( $reg, 'doSomething2', $matches[0] );
}
function doSomething2( $matches ) {
return str_replace( "hoge", '<a href="hoge.html">hoge</a>', $matches[0]);
}

おそらく、否定先読みというのをしてらっしゃるのではないかと思いますが、ど
ういう
仕組みなのかは理解できてません(汗
(というか、違っていたらごめんなさい)
$reg = '|>(?:((?!>).)*)<(?!/a)|s'; (この部分)

また、コールバックの仕組みがあるとは知りませんでした。
今回、2回ふるいにかける事で対応できました( ^ ^ ;)

皆様本当に助かりました。ありがとうございましたm( _ _ )m





oppara wrote:
> こんにちは、大原と申します。
>
> 一度に置換するのは難しかったので、
>
>   
>>> preg_replaceなどを用いて、html文章中の特定のキーワードを
>>> リンク付の文字列に置き換えたいと考えています。
>>> その際に、アンカータグに囲まれたキーワードと、
>>> imgタグのalt属性などに含むキーワードは無視させたいので 
>>> す。
>>>       
>
>   
>> '>'と、'/a'が後ろに続かない'<'に挟まれてるキーワード
>>     
>
> $reg = '|>(?:((?!>).)*)<(?!/a)|s';
>
> $html = <<<__EOF__
> <p class="hoge">moge hoge<a href="hoge.html"
> title="hoge">hoge</a>...</p>
> <p class="hoge"><img src="hoge.jpg" alt="hoge moge" /> hohogege  
> hoge .</p>
> __EOF__;
>
> echo preg_replace_callback( $reg, 'doSomething', $html );
>
> function doSomething( $matches ) {
>      return preg_replace( "|\b(hoge)\b|", '*$1*', $matches[0]);
> }
>
>
> こんな感じ?(抜けありそうですけど)
>
> _______________________________________________
> PHP-users mailing list  PHP-users @ php.gr.jp
> http://ml.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://www.php.gr.jp/php/novice.php3
>
>   

-- 
☆■▽〜☆■▽〜☆■▽〜☆■▽〜☆■▽〜

  江 頭  竜 二

  〒840-0123 福岡市城南区長尾3-9-5
   TEL    090-2586-8452
   Email  ryu-ring.woo @ cap.ocn.ne.jp

☆■▽〜☆■▽〜☆■▽〜☆■▽〜☆■▽〜



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