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