web-dev-qa-db-ja.com

PHPトリムとスペースが機能しない

Csvからインポートしたデータがあります。インポートスクリプトは、csv内のすべての電子メールアドレスを取得し、それらを検証した後、それらをデータベースにインポートします。

クライアントがこのcsvを提供しており、一部の電子メールにはセルの最後にスペースがあるようです。問題ありません、その吸盤を切り落とします...いいえ、動作しません。

スペースはスペースではないようで、削除されていないため、一連の電子メールの検証に失敗しています。

質問:この誤った文字が何であるかを実際に検出する方法と、それを削除する方法はありますか?

ファンキーなエンコーディングなのか、それとも何か他のことが起こっているのかはわかりませんが、すべて手動で削除するのは好きではありません。最初に文字列をUTF-8でエンコードすると、この文字は次のように表示されます。

ÂÂ

12
Horse

その「スペース」がtrim()の影響を受けない場合、最初のステップはそれを識別することです。

文字列でurlencode()を使用します。 Urlencodeは、ASCII以外の印刷不可能な文字や多くの印刷可能な文字をパーセントエスケープするため、問題のある文字の16進コードがすぐに表示されます。発見した内容に応じて、それに応じて行動するか、質問を更新して追加のヘルプを得ることができます。

30
Sven

同様の問題があり、CSVからの電子メールの読み込みや、「検出できない」空白の問題もありました。

最も一般的なurlencoded空白文字を ''に置き換えることで、これを解決しました。これは、mb_detect_encoding()やiconv()を使用できない場合に役立つ可能性があります

    $urlEncodedWhiteSpaceChars   = '%81,%7F,%C5%8D,%8D,%8F,%C2%90,%C2,%90,%9D,%C2%A0,%A0,%C2%AD,%AD,%08,%09,%0A,%0D';
    $temp = explode(',', $urlEncodedWhiteSpaceChars); // turn them into a temp array so we can loop accross
    $email_address  = urlencode($row['EMAIL_ADDRESS']);
        foreach($temp as $v){
            $email_address  =  str_replace($v, '', $email_address);     // replace the current char with nuffink
        }
        $email_address = urldecode($email_address); // undo the url_encode

これは「通常の」スペース文字を削除せず、文字列のどこからでもこれらの空白文字を削除することに注意してください-開始または終了だけではありません。

2
Rid Iculous

ほとんどの場合、単純なstrip_tags($string)が機能します。

上記が機能しない場合は、urlencode()に頼る文字を特定し、それに応じて行動する必要があります。

1
Slipstream

考えられる解決策がいくつかあります

1)PHPの文字列の最後の文字を取得し、それが正規表現であるかどうかを確認します(たとえば、正規表現を使用)。通常の文字でない場合は、削除します。

$length = strlen($string);
$string[($length-1)] = '';

2)文字をUTF-8からCSVファイルのエンコードに変換し、str_replaceを使用します。たとえば、CSVがISO-8859-2でエンコードされている場合

echo iconv('UTF-8', 'ISO-8859-2', "Â"); 
0
Mateusz Nowak