Replaces 'ill-formed' byte sequences with '?'.
See: https://github.com/php/php-src/pull/1099(PHP 7 >= 7.2.0, PHP 8)
mb_scrub — 文字列に含まれる不正なバイト列を代替文字に置き換える
指定されたエンコーディングに基づいて、文字の変換を行います。 エンコーディングが指定されない場合は、 デフォルトのエンコーディングが使われます。 この関数は、不正なバイトシーケンスを代替文字に置換する効果があります。
string入力文字列
encoding
string を解釈するエンコーディング。
省略されるか、null でない場合は、
mbstring.internal_encoding setting が設定されている場合、それを使います。
設定されていない場合は、default_charset の設定を使います。
不正なバイトシーケンスを置換した文字列を返します。
| バージョン | 説明 |
|---|---|
| 8.0.0 |
encoding は、nullable になりました。
|
例1 mb_scrub() が行うバイト単位の置換
ここで bin2hex() を使っているのは、端末やブラウザ、 フォントが不正なバイト列を独自の置換文字で表示してしまうことがあり、 文字列が実際に何を含んでいるのかがわからなくなるからです。
<?php
// バイト 0xFF は、正しい UTF-8 文字列には現れません。
$input = "A\xFFB";
echo bin2hex($input), "\n";
// デフォルトの代替文字は "?" (0x3F) です。
echo bin2hex(mb_scrub($input, 'UTF-8')), "\n";
// U+FFFD REPLACEMENT CHARACTER は、UTF-8 では EF BF BD にエンコードされます。
mb_substitute_character(0xFFFD);
echo bin2hex(mb_scrub($input, 'UTF-8')), "\n";
?>上の例の出力は以下となります。
41ff42 413f42 41efbfbd42
例2 UTF-8 を前提とする処理の前に mb_scrub() を使う
u 修飾子を使った PCRE のパターンは、
UTF-8 として正しくない対象文字列を受け付けません。
あらかじめ入力の不正なバイト列を置き換えておけば、
受け付けられるようになります。
<?php
$input = "A\xFFB";
var_dump(preg_match_all('/./us', $input));
echo preg_last_error_msg(), "\n";
$clean = mb_scrub($input, 'UTF-8');
var_dump(preg_match_all('/./us', $clean));
?>上の例の出力は以下となります。
bool(false) Malformed UTF-8 characters, possibly incorrectly encoded int(3)
Replaces 'ill-formed' byte sequences with '?'.
See: https://github.com/php/php-src/pull/1099