web-dev-qa-db-ja.com

デコードされた分割不可スペース(nbsp)を置き換える方法

_"a s d d"_という文字列があり、htmlentitiesがそれを
_"a s d d"_。

エンティティにエンコードせずにそれを置換する方法(preg_replaceを使用)?

preg_replace('/[\xa0]/', '', $string);を試しましたが、機能しません。それらの不要な特殊文字を文字列から削除しようとしています

正規表現以外の可能性は何ですか?

解析する文字列を編集: http://Pastebin.com/raw/7eNT9sZr
関数preg_replace('/[\r\n]+/', "[##]", $text)
後で使用する場合implode("</p><p>", explode("[##]", $text))

私の質問は、これを行う「方法」ではありません(エンティティをエンコードしたり、不要なエンティティを削除したり、エンティティをデコードしたりできるため)。しかし、str_replaceまたはpreg_replaceだけでそれらを削除する方法。

16
Grzegorz

問題は、間違った方法で non-breakable space を指定していることです。 UTF-8エンコードでの改行不可スペースの適切なコードは0xC2A0で、2バイトで構成されます-C2194)とA0160)、キャラクターのコードの半分だけを指定しています。

必要に応じて、単純な(そして高速な)str_replaceを使用するか、より柔軟な正規表現を使用して置き換えることができます。

// faster solution
$regular_spaces = str_replace("\xc2\xa0", ' ', $original_string);

// more flexible solution
$regular_spaces = preg_replace('/\xc2\xa0/', ' ', $original_string);

str_replace の場合、検索文字列を囲むには二重引用符(")を使用する必要があることに注意してくださいそれは文字コードのテキスト表現を理解しないため、最初にそれらのコードを実際の文字に変換する必要があります。 PHPによって自動的に作成されます。二重引用符で囲まれた文字列が処理され、特別なシーケンス(たとえば、改行文字\n、文字コードのテキスト表現など)が実際の文字に置き換えられるためです。 (たとえば、UTF-8では0x0A\n)文字列値が使用される前。

対照的に、 preg_replace 関数自体は文字コードのテキスト表現を理解するので、PHPそれらを実際の文字に変換し、この場合、アポストロフィ(一重引用符、')を使用して検索文字列を囲むことができます

UTF-8エンコーディングは、いわゆる可変幅文字エンコーディングと呼ばれます。つまり、文字コードは1〜4(8ビット)バイトで構成されます。一般的に、頻繁に使用される文字のコードは短く、エキゾチックな文字のコードは長くなります。