ゼロ幅スペースとは
PHPにて、半角文字以外が含まれるかどうかを判別したく以下コードを書いてたんですよ。
正規表現部分は「!から~までの文字と半角スペース 以外」ですね。
if (preg_match("/([^!-~\s]+)/", $str, $matches)) { var_dump($matches[0]); }
その中、こんな出力をされるデータがありました。
string(3) ""
いやいや、空文字に見えるんですが…。しかも3バイトもあることになってる。
これをurlencode関数にかけてみると「%E2%80%8B」というのが出てきました。
なんやこれ…と思って調べてみると、なんと「幅がゼロのスペース」。
なにそれ??なんのために存在すんの????
だいぶ意味がわからないのですが、
存在してしまっているものは仕方ないので、必要に応じて考慮が必要ですね。
ほかにも様々なスペースがありますが、( スペース - Wikipedia )
とりあえずここではこのゼロ幅スペースを削除する方法を考えます。
// 1. ピンポイントで消す $str = str_replace("\xe2\x80\x8b", "", $str); // 2. 他のいらなさそうな制御文字も併せてごっそり消す $str = preg_replace("/\p{C}/u", "", $str);
1はとにかくこのゼロ幅スペースのみを消したい場合。
2は制御文字全般を消してくれる…はず。
PHP: Unicode 文字プロパティ - Manual
参考:
[PHP]改行なしスペース( 、0xA0)を、普通の空白(0x20)に置換する
空白を削除する
マルチバイト(全角スペース等)対応のtrim処理
空白を削除する
<U+200B>(幅なしスペース)というやつに悩まされた話 | 自転車で通勤しましょ♪ブログ
リンク切れでURLに「%E2%80%8B」が見つかった場合の対処法 | colori