dポイントプレゼントキャンペーン実施中!

PHP初心者です。

trimファンクションを使って前後の全角スペースを削除したいのですが

$test = " 左右に全角スペースがある文字列 ";
echo trim ( $test , " " );

だと問題なく表示されるのですが以下のようにテキストボックスに入力した文字の

前後の全角スペースを削除しようとすると最初の1文字目が文字化けします。


●test_input.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio …
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>前後の全角スペースを削除する</title>
</head>

<body>
<form action="test.php" method="get">
<dl>
<dt>文字を入力してください。</dt>
<dd><input type="text" name="test" size="50" maxlength="50" id="test" />
</dd>
</dl>
<input type="submit" value="送信する" />
</form>
</body>
</html>


●test.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio …
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>前後の全角スペースを削除する</title>
</head>

<body>
<p>入力文字</p>
<?php
$test = ($_REQUEST['test']);
echo ($test);
?>
<br />
<br />
<p>trim ( $test , " " )</p>
<?php
echo trim ( $test , " " );
?>
</body>
</html>


どこがいけないのでしょうか?

よろしくお願いします。

A 回答 (4件)

trim関数の第二引数は、マルチバイト文字を受け付けません。


受け付けている様に見えますが、実際には、ソレをシングルバイトに展開しているイメージです。

付きまして、

<?php


echo tirm($test, " ");
//これを、やめて、

mb_regex_encoding("utf-8"); //これは実際にはスクリプトの先頭とかに一回だけ記述してやればOK
echo mb_ereg_replace("^ *(.+?) *$", '\\1', $string);


?>
といった具合にすればいけると思いますが、いかがでしょう。
    • good
    • 0
この回答へのお礼

回答有難うございます。

無事解決できました。

お礼日時:2011/02/04 00:58

あぁ、そうか。


正規表現が悪すぎました。
お詫びして訂正します。すみません。
<?php

echo mb_ereg_replace("^ *| *$", '', $string);


?>
これでいいですね。
utf-8固定なら、yuu_xさんの仰るとおりpreg_replaceのほうが早いです。
    • good
    • 0
この回答へのお礼

回答有難うございます。

お礼日時:2011/02/04 00:59

* が抜けた。


preg_replace('/^(?: )*|(?: )*$/u');
    • good
    • 0

よく分からんけど、ひらがな、カタカナ、一部記号なら確実に化ける。

他にも多数。

用件を満たす場合、trim はふさわしくない。大半がシングルバイト関数だと何度いったら。。。まぁいい。

trim の第二引数は、char list を取る。したがって 全角スペースに含まれる バイトコード、xE3、x80 が削除される。

ひらがな、カタカナ、その他記号は E3 から始まるため、先頭バイト(80 を含んでいればそれを含む)が削除され文字として意味を成さなくなる。

マルチバイトを消したければマルチバイト関数、あるいは他に代替がない場合は文字列関数で代用できないこともない。

まぁ、UTF-8 だし、正規表現辺りで
$str = preg_replace('/^ | $/u', ''); // UTF-8 以外でこんなことをしてはいけない。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!