全角スペースを削除する方法と注意点

このQ&Aのポイント
  • PHP初心者の質問者は、テキストボックスに入力された文字の前後の全角スペースを削除する方法について尋ねています。
  • 質問者は、trimファンクションを使用して全角スペースを削除しようとしましたが、文字化けの問題が発生しました。
  • この問題は、PHPの設定ファイルで文字エンコーディングが正しく設定されていないために発生している可能性があります。
回答を見る
  • ベストアンサー

前後の全角スペースを削除すると文字化けする

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-transitional.dtd"> <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-transitional.dtd"> <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> どこがいけないのでしょうか? よろしくお願いします。

  • PHP
  • 回答数4
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

trim関数の第二引数は、マルチバイト文字を受け付けません。 受け付けている様に見えますが、実際には、ソレをシングルバイトに展開しているイメージです。 付きまして、 <?php echo tirm($test, " "); //これを、やめて、 mb_regex_encoding("utf-8"); //これは実際にはスクリプトの先頭とかに一回だけ記述してやればOK echo mb_ereg_replace("^ *(.+?) *$", '\\1', $string); ?> といった具合にすればいけると思いますが、いかがでしょう。

shorinji36
質問者

お礼

回答有難うございます。 無事解決できました。

その他の回答 (3)

回答No.4

あぁ、そうか。 正規表現が悪すぎました。 お詫びして訂正します。すみません。 <?php echo mb_ereg_replace("^ *| *$", '', $string); ?> これでいいですね。 utf-8固定なら、yuu_xさんの仰るとおりpreg_replaceのほうが早いです。

shorinji36
質問者

お礼

回答有難うございます。

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.3

* が抜けた。 preg_replace('/^(?: )*|(?: )*$/u');

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.2

よく分からんけど、ひらがな、カタカナ、一部記号なら確実に化ける。他にも多数。 用件を満たす場合、trim はふさわしくない。大半がシングルバイト関数だと何度いったら。。。まぁいい。 trim の第二引数は、char list を取る。したがって 全角スペースに含まれる バイトコード、xE3、x80 が削除される。 ひらがな、カタカナ、その他記号は E3 から始まるため、先頭バイト(80 を含んでいればそれを含む)が削除され文字として意味を成さなくなる。 マルチバイトを消したければマルチバイト関数、あるいは他に代替がない場合は文字列関数で代用できないこともない。 まぁ、UTF-8 だし、正規表現辺りで $str = preg_replace('/^ | $/u', ''); // UTF-8 以外でこんなことをしてはいけない。

関連するQ&A

  • PHP 問い合わせフォームの文字化け

    はじめまして。 会員648です。 Websiteを作成し、問い合わせフォームで 入力をHTML、チェック・確認画面、送信をPHPで 作成しました。 初心者なので、サイトでの作成事例をまねております。また文字化けは UTF-8を書けば良い ということも サイトにあったので、とりあえずそうしました。 しかし 他のHTMLは正常に表示しますが、HTMLの入力画面、PHPチェック画面 すべて  文字化けします。 入力画面は <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <form method="post" action="check.php"> ですが 文字化け表示となります。 内容確認画面は check.php で <?php // フォームデータが空の場合は処理終了 if (empty($_POST)) { echo "処理終了"; exit; } // セッションの開始 session_start(); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> で始まります。 詳しくPHPを知りませんので、どこが問題なのか 教えていただけませんでしょうか。 なお、テスト環境は 自分のPCで Xampp をインストールして、htdocs 配下に すべての HTML, CSS, image,php を 置いております。 なにとぞ よろしくお願いいたします。

    • 締切済み
    • PHP
  • XHTML meta属性 文字化け

    XHTMLを勉強しています。 以下のように記述して表示すると タイトルの部分が文字化けします。 何故でしょうか <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <title>ホームページの作り方</title> <meta name="description" content="初心者のためのホームページテスト" /> <meta name="keywords" content="ホームページ,作成,初心者" /> </head> <body> テスト </body> </html>

    • ベストアンサー
    • HTML
  • utf-8 文字化け

    メモ帳でhtmlページを作成してたのですが、日本語を入力してIEで確認したら文字化けになります 原因がわからず困っていました よろしくお願いします IE10 IE 表示 エンコードはutf-8 自動選択にすると日本語表示になります <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>ABC</title> <style type="text/css"> </style> </head> <body> <h1>ようこそ</h1> <p></p> </body>

  • CakePHP文字化けについて

    お世話になります。基本的な質問で申し訳ないのですが、CakePHPのインストールをしたのですが、ブラウザ経由の文字化けが発生しており、困っております。 \app\webrootに以下のHTMLファイルを設置し、ブラウザ経由でアクセスしたのですが、エンコードUTF-8でアクセスすると文字化けが発生してしまいます。エンコードをShift-JISに指定しなおしたところ問題なく表示されるのです。charset=utf-8を指定しているにも関わらず、Shift-JISで表示されるのはどうしてですか。また、UTF-8で正常に表示するには、追加で設定が必要になるのでしょうか。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head>    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>    <title>Hello</title> </head> <body> <p>これは、テストページです。</p> </body> </html>

    • 締切済み
    • PHP
  • XHTMLの文字コードのEUC-JPの文字化け

    いつもはHTML4.01で作業をしていて XHTMLはどうも不慣れなせいか 今、外注が作成したHPを修正していて 文字コードをEUC-JPにどうしても変更しなければならないのですが それがうまくいかず、文字化けが発生してます。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> を <?xml version="1.0" encoding="euc-jp"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp" /> このように設定したら文字化けが発生しました。 どのように設定したら文字化けがなくなりますか?

  • なぜ文字化けしないのでしょうか?

    Windows Me(shift_jis)とFedoraCore4(utf-8)のPCのブラウザに以下のFedoraCoreのPCに配置してあるgomi.php(utf-8で記載)を表示させて 入力欄に「お元気ですか。」と日本語を入れてもその応答が文字化けしません FC4はutf-8なのでshift_jisのWindows Meでは文字化けするはずですがしませんがどうしてでしょうか? gomi.php -------------------------------------------------------- <?php $in=isset($_POST['in'])?$_POST['in']:'bad'; echo '<?xml version="1.0" encoding="utf-8"?>'; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8"/> <title>test</title> </head><body> <p><?= $in ?></p> <form method="post" action="<?= $_SERVER['PHP_SELF'] ?>"> <input type="text" name="in"/> <input type="submit" value="送信"/> </form> </body></html>

    • ベストアンサー
    • PHP
  • WAMP ローカル環境で突然文字化けするように

    WAMP初級者です。 いままでPEAR::DBを使って作っていたサイトがあり、PDOを使うように修正をしているのですが、いろいろ試しても画面が真っ白になってしまうようになりました。 そこで、いったんPDOを理解するために、下記のような小さなプログラムを作ってしっかり理解してから、取り組もうといろいろ試しましたが、やっぱり画面が真っ白になってしまいました。 なので、今度は念のため、単純にPOSTで受け取った情報を単純に表示するだけのコードでためしたところ、今度はなぜか文字化けするようになってしまいました。。 「???」のような表示ではなく、「・・・」のような表示です。 いままでPEAR::DBを使っていたサイトは(過去に文字化けで苦労した時代はありましたが)いまはちゃんとUTF-8で統一したので、文字化けは解消されています。 どこか設定をいじった記憶もなく、突然初歩的なPHPも動いてくれなくなってしまって途方にくれています。PEAR::DBを使ってちゃんと動いていたサイトは、文字化けしません。 今回やったことのどこが悪いのか、路頭にまよっています。 どなたかヒントをいただけないでしょうか? 環境はPHP5.2(古いので、この件が片付いたらバージョンアップする予定です)、Windowsです。 ●サンプルで作ったHTML <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <form action = "for_pdo_test2.php" method="post"> キーワード:<input type="text" name="keyword"> <input type="submit" name="exec" value="検索"> </form> </body> </html> ●下記がfor_pod_test2.phpです (コメントアウトしている箇所がPDOの動作確認用につくったものです) <?php header("Content-Type:text/html;charset=UTF-8"); error_reporting(4); $keyword=$_POST['keyword']; /* try{ $query="SELECT * FROM book where Name like :name"; $connection=new PDO('mysql:host=localhost;dbname=book_db','root','root'); $stmt=$connection->prepare($query); $stmt->bindValue(":name","'%$keyword%'",PDO::PARAM_STR); $stmt->execute(); while($result = $stmt->fetch(PDO::FETCH_ASSOC)){ print($result['BID']); print($result['Name'].'<br>'); } }catch(PDOException $e){ print('Error:'.$e->getMessage()); die(); } */ ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <?php echo "aaa"; ?><br/> <?php echo $keyword; ?> </body> </html> 以上です。 検索をして飛んだ先で aaa ・・・ と表示されてしまいます。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP 文字化けの解決策。

    こんばんわ。PHP初心者です。 以下のコードは、http://table.yahoo.co.jp/tのソースをすべて読み取り、ブラウザ上で表示させるプログラムです。 ですが、ブラウザ(クロームを使用)で表示する際、なぜか文字化けしてしまいます。 どうすれば解決するでしょうか? ちなみにhttp://www.yahoo.co.jp/は文字化けせず、正常に表示させることができます。 PHP.iniをいじる必要がありますか? PHP.iniのことは一切分かりません。 よろしくお願いします。 <?php $result = ""; $lines = @file("http://table.yahoo.co.jp/t") or $result = "ファイルが読めません。"; if ($lines != null){ for($i = 0;$i < count($lines);$i++){ $result .= ($i + 1) . ": " . $lines[$i] . "<br>"; } } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>sample page</title> </head> <body> <h1>Hello PHP!</h1> <p><?php echo $result; ?></p> </body> </html>

    • ベストアンサー
    • PHP
  • 文字の見た目の長さを取得する方法について

    文字の見た目の長さを取得し、全角■(半角■×2)に収まっているかチェックしようと思い、下記のソースを記述したのですが、特定の文字で意図した結果になりませんでした。 【ソース】 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>title</title> </head> <body> <?php $array = array( "1234567890" // 1. 10とカウントしたい , "12345" // 2. 10とカウントしたい , "侉侉侉侉侉" // 3. 10とカウントしたい , "※※※※※" // 4. 10とカウントしたい , "112233" // 5. 9とカウントしたい ); for($i=0; $i<count($array); $i++) { // 3がNG echo strlen(mb_convert_encoding($array[$i], 'SJIS', 'UTF-8')); echo "<br />"; // 4がNG echo mb_strwidth($array[$i], 'UTF-8'); echo "<br />"; echo "<br />"; } ?> </body> </html> 【結果】 10 10 10 10 5 10 10 5 9 9 http://hamamuratakuo.blog61.fc2.com/blog-entry-421.htmlのUTF-8の日本語のバイト数が原因かもと思ったのですが、どうすれば文字の見た目の長さを取得できるか分からなかった為、アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。 以上、よろしくお願いします。

    • ベストアンサー
    • PHP
  • 文字列の一部を取り出したいのですが、文字化けしてしまいます。

    文字列の一部を取り出したいのですが、文字化けしてしまいます。 コードは以下のとおりです。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> </head> <body> <?php $str = "日本語日本語UTF-8"; print mb_substr($str, 0, 3); ?> </body> </html> おそらく2バイト文字の途中で切っているので文字化けするのだと思いますが、 対象方法が分かりません。 ご存知の方がいらっしゃいましたら、すみませんが教えてください。

    • ベストアンサー
    • PHP

専門家に質問してみよう