[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 メーリングリストの案内