mb_scrub

(PHP 7 >= 7.2.0, PHP 8)

mb_scrub — 文字列に含まれる不正なバイト列を代替文字に置き換える

説明

function mb_scrub(string $string, ?string $encoding = null): string

指定されたエンコーディングに基づいて、文字の変換を行います。 エンコーディングが指定されない場合は、 デフォルトのエンコーディングが使われます。 この関数は、不正なバイトシーケンスを代替文字に置換する効果があります。

パラメータ

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)

参考

+add a note

User Contributed Notes 1 note

up
22
Sammitch
8 years ago
Replaces 'ill-formed' byte sequences with '?'.

See: https://github.com/php/php-src/pull/1099