2

Web サイトの文字に問題があります。

私は、ユーザーが wysiwyg エディター (ckeditor) を使用してプロファイルを入力できる Web サイトを持っています。コンテンツは、データベースに配置される前に htmlpurify を介して実行されます (セキュリティ上の理由から)。

データベースには、すべてのテーブルが UTF-8 文字セットで設定されています。また、問題を防ぐために、スクリプト実行の開始時に「SET NAMES utf-8」を呼び出します (この問題は長い間発生していないため、これは何年も機能しています)。テキストが表示される Web ページの content-type は utf-8 で、header() 関数を使用して content-type と charset も設定します。

テキストを表示するとき、コンテンツで正規表現を実行しようとするまで、すべて問題ないように見えました。html_entity_decode (「utf-8」のエンコーディング パラメータで呼び出される) は何らかの理由で Â 文字を削除/表示せず、すべての正規表現が失敗する原因となっているものを残します (そこに文字があるようですが、できません)ソースで確認してください)。

正規表現を実行できるように、この文字を防止または削除するにはどうすればよいですか?

編集:私は ckeditor を放棄し、このサイトがより柔軟に使用するようなマークダウン形式を使用することにしました。覚えている限り、私は wysiwyg エディターが嫌いでした。すべてのプロファイルを新しい形式に更新すると、問題のあるテキストをすべて削除して、サイトをクリーンなスタートにすることができます。すべての入力に感謝します。

4

2 に答える 2

1

おそらく、文字列が実際には適切に UTF-8 でエンコードされていないという状況に直面しているでしょう (あなたが書いたように、そうではありません)。html_entity_decode次に、無効な UTF-8 バイト シーケンス (たとえば、 のシングルバイト文字セット エンコーディングÂ) を置換文字で削除する可能性があります。

使用している PHP のバージョンによっては、フラグを使用してこれに対処する方法をより詳細に制御できます。

さらに、見えない文字を見つけるには、stringの 16 進ダンプを作成します。

于 2012-04-12T18:30:06.017 に答える
1

あなたが話している文字はANSI文字セット内に存在するので、これを行うことができます:

utf8_encode( preg_replace($match, $replace, utf8_decode($utf8_text));

ただし、これにより、ANSI 文字セット内に存在しない Unicode 文字が破棄されます。これを避けるために、いつでもmb_ereg_replaceマルチバイト (Unicode) をサポートする which を試すことができます:

string mb_ereg_replace ( string $pattern , string $replacement , string $string [, string $option = "msr" ] )

于 2012-04-12T18:34:43.860 に答える