アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

('ω') < イザユケエンジニャー

ゼロ幅スペースとは

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