_"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だけでそれらを削除する方法。
問題は、間違った方法で non-breakable space を指定していることです。 UTF-8エンコードでの改行不可スペースの適切なコードは0xC2A0
で、2バイトで構成されます-C2
(194
)とA0
(160
)、キャラクターのコードの半分だけを指定しています。
必要に応じて、単純な(そして高速な)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ビット)バイトで構成されます。一般的に、頻繁に使用される文字のコードは短く、エキゾチックな文字のコードは長くなります。