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

聖歩美 hijiri.walk @ gmail.com
2007年 2月 13日 (火) 23:48:10 JST


聖と申します。
江頭さん、こんばんわ。


当初の投稿では「e-words」のようなもの、とのことでしたので、
きっと複数のキーワードを一度に変換されることをご希望でしょうね。

正規表現一発、ではないですけど、私も丁度欲しいものだったので
ためしに str_replace 関数のようなノリで使える function 作ってみました。
コメントタグとか<pre>とかスクリプトとかが無ければ
ご希望のとおり動くんではないかと思います。

考え方としては
タグと、そうでない文字の間には必ず不等号文字があるということですね。


# すっごいすっごい初心者なコーディングで恥ずかしいです/´∀`;;;;\
# でも「はてな」とかでこれ書いたら300ポイントくらいもらえないかなあ

<?php

$HTML =<<<__EOD__
<html>
<head>
<title>特定のキーワードを含む文章</title>
</head>
<body>
<h1>特定のキーワードを含む文章</h1>
<p><img src="/img.jpg" width="480" height="240" alt="特定のキーワードを含む文章" /></p>
<p>ここでは特定のキーワードを含む文章について説明します。</p>
<ul>
<li><a href="/">特定のキーワードについて</a></li>
<li><a href="/">特定のキーワードではないものについて</a></li>
</ul>
<p>以上、特定のキーワードを含む文章について説明しました。</p>
</body>
</html>
__EOD__;



print innerText_replace( "キーワード", '<a href="/?keyword">きーわーど</a>', $HTML );



function innerText_replace( $from, $to, $html ){

  $row = 0;
  $ret = "";
  $flag = array();

  // ここに列挙したタグで囲まれたテキストには処理させない
  // (下記のようなノリで足してもらえれば他のタグも足せます)
  $flag['a'] = 0;
  $flag['h1'] = 0;
  $flag['textarea'] = 0;
  $flag['title'] = 0;
  $flag['button'] = 0;
  $flag['select'] = 0;
  $flag['option'] = 0;

  $lines = split("[<>]", $html );

  if( count( $lines ) < 2 ){ return $html; }

  while( isset($lines[$row]) ){

    if( $row % 2 == 0 ){

      if( array_sum( $flag ) == 0 ){

        $lines[$row] = str_replace( $from, $to, $lines[$row] );

      }

      $ret .= $lines[$row];

    }else{

      foreach( $flag as $tagname=>$dummy ){

        if( $lines[$row] == $tagname || ( stripos( $lines[$row],
$tagname." " ) === 0 ) ){

          $flag[$tagname] = 1;

        }elseif( stripos( $lines[$row], '/'.$tagname ) === 0 ){

          $flag[$tagname] = 0;

        }

      }

      $ret .= '<' . $lines[$row] . '>';

    }

  $row++;
  }

return $ret;
}

?>

----------------
聖


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