[PHP-users 15379]Re: eregiのつかいかた

Osamu Shigematsu m5issige @ mr.hitachi-medical.co.jp
2003年 5月 19日 (月) 18:37:25 JST


重松です。こんにちは。

> <?php
> // 漢字コードはEUCです
> $str = '&lt;font size=-1 color="#ff0000"&gt;てーすとー&lt;/font&gt;' ;
> print $str;
> print "<br>\n";
> print html_entity_decode($str);
> ?>

これって、今回のケースでは、たぶん役立たずです。
htmlspecialchars() の逆としか読めないんですが?

で、PUYO さんへ:

気軽に発言してもらってもいいんですけど、
最低限のマナーってありますよね。
例えば、どこの誰と名乗るとか。
技術的なことでは、スレッドをきらないとか。

こういう暗黙のルール/マナーは、逆説的にいえば、
気軽に発言するためにあるのではと思います。

メールを読む人は、見ず知らずのまったくの他人ということをお忘れなく。
そして、自分以外のほかの人のメリット/幸せも考えましょう。

あと、いろいろ思うところはあるのですが、単に置換するだけでは、
他の問題を誘発する可能性があるので、たたき台になるコードを書いてみました。

ここでいう問題とは、

	(1) タグを故意に閉じない
	(2) やたら大きな文字を指定し、レイアウトを乱す
	(3) 背景色と同じ色を指定したりする嫌がらせ

をさくっと受け付けますね。>PUYO 氏

この程度のことは予見できるわけだから、単に置換のコードを聞かれて、
それをそのまま書くようではなんというか、(以下自粛)。

# 問題にぶつかることを予見していても、その問題を示さない、
# それって、結構罪ではない?

まあ、情けは人のためならず、ということで、PHP 4.2.3RC2 で動作確認済み。
(要 mb_ereg)

コメントはつけてませんけど、上記 (1) -- (3) 位に対しては、
不完全ながらもヒントは示したつもり。

ニーズ/環境に基づいて改造してみてください。

<?php
$str = "xxxx xxx&lt;font size=\"10\" color='red'&gt;yyy yyy&lt;/font&gt;zzz zzz";
//$str = "xxxx xxx&lt;font color=\"red'&gt;yyy yyy&lt;/font&gt;zzz zzz";

if (mb_ereg('&lt;[Ff][Oo][Nn][Tt](.*?)&gt;(.*?)&lt;/font\s*&gt;', $str, $matches)) {
        var_dump($matches);
        $tag = array('font');
        $elements = mb_split('\s+', trim($matches[1]));
        var_dump($elements);
        foreach($elements as $element) {
                list($key, $val) = explode('=', $element);
                print "$key => $val\n";
                $key = strtolower(trim($key));
                $len = strlen($val);
                if ($len > 2 && ($val[0] == '"' || $val[0] == "'")) {
                        if ($val[0] != $val[$len - 1])
                                continue;
                        $val = '"' . substr($val, 1, -1) . '"';
                }
                switch ($key) {
                case 'color':
                        $tag[] = "$key=$val";
                        break;
                }
        }
        $tag = implode(' ', $tag);
        $str = str_replace($str, $match[0], "<$tag>{$matches[2]}</font>");
        echo $str;
}
else {
        die('no match');
}
?>

実行例:
> php -q test.php
array(3) {
  [0]=>
  string(54) "&lt;font size="10" color='red'&gt;yyy yyy&lt;/font&gt;"
  [1]=>
  string(22) " size="10" color='red'"
  [2]=>
  string(7) "yyy yyy"
}
array(2) {
  [0]=>
  string(9) "size="10""
  [1]=>
  string(11) "color='red'"
}
size => "10"
color => 'red'
<font color="red">yyy yyy</font>
-- 
Osamu Shigematsu <m5issige @ mr.hitachi-medical.co.jp>



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