2012-04-12 3 views
2

У меня возникла проблема с символом Â на моем сайте.PHP: html_entity_decode удаление/не отображение символа

У меня есть веб-сайт, где пользователи могут использовать редактор wysiwyg (ckeditor) для заполнения своего профиля. Содержимое запускается через htmlpurify перед тем, как быть помещенным в базу данных (по соображениям безопасности).

В базе данных есть все настройки таблиц с кодировкой UTF-8. Я также называю «SET NAMES utf-8» в начале выполнения скрипта для предотвращения проблем (которые работали годами, поскольку у меня не было этой проблемы в течение длительного времени). Веб-страница, на которой отображается текст, имеет тип utf-8 содержимого, и я также использую функцию header() для установки типа контента и кодировки.

При отображении текста все казалось прекрасным, пока я не попытался использовать регулярное выражение для содержимого. html_entity_decode (вызываемый с параметром encoding для «utf-8») по какой-либо причине удаляет/не показывает символ Â, и он оставляет позади что-то, из-за чего все мои регулярные выражения терпят неудачу (кажется, там есть символ, но я не могу просмотрите его в источнике).

Как предотвратить и/или удалить этот символ, чтобы я мог запускать регулярное выражение?

EDIT: Я решил отказаться от ckeditor и пойти с форматом уценки, как этот сайт использует для большей гибкости. Я ненавидел редакторов wysiwyg до тех пор, пока я помню. Обновление всех профилей в новом формате даст мне возможность удалить все нарушающие текст и дать сайту чистый старт. Спасибо за все входные данные.

+0

что регулярное выражение делает? –

+0

Удаляет пустые теги абзаца. По какой-то причине пользователям нравится добавлять лишние строки при редактировании, что делает веб-сайт ужасным. Он должен удалять теги абзаца только с пробелами и/или nbsp; организация. Пример: http://dev.lovewichita.org/church/profile/25.html – kkeith29

+0

+1 для помощи церкви вне – ANisus

ответ

1

Возможно, вы столкнулись с ситуацией, когда строка фактически не кодируется кодировкой UTF-8 (как вы ее написали, но это не так). html_entity_decode может затем удалить любые недопустимые последовательности байтов UTF-8 (например, однобайтовое кодирование кодировки Â) с символом замещения.

В зависимости от используемой вами версии PHP у вас есть больше возможностей справиться с этим, используя флаги.

Кроме того, чтобы найти персонажа, которого вы не видите, создайте hexdump of the string.

+0

Я скопировал и вставил из старой версии веб-сайта. Не будет ли текст преобразован в формат, читаемый в кодировке UTF-8? – kkeith29

+0

@ kkeith29: Это зависит. Использование UTF-8 не означает, что магически все работает сейчас, это всего лишь кодировка символов. Я думаю, что это наиболее информативно, если вы добавите код, с которым у вас проблемы, к вашему вопросу и hexdump строки, с которой вы столкнулись. – hakre

+0

Код, который создает текст, распространяется по всей структуре (класс формы, контроллеры, модели и помощники), поэтому его сложно разместить здесь. Спасибо за упоминание hexdump, он сделал много исследований относительно того, как это поможет, и это значительно расширило мои знания о том, как данные превращаются в текст и как кодировки играют в это. Благодаря вам я подтвердил, что это проблема с кодировкой с этим текстом (пробел является виновником, он выписывается как два символа, а также пробел из-за многобайтовых вещей из того, что я понимаю). – kkeith29

1

Поскольку характер вы говорите о том, существует в кодировке ANSI, вы можете сделать это:

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

Это будет, однако, уничтожить любой юникода характер не существует в кодировке ANSI. Чтобы избежать этого, вы всегда можете попробовать использовать mb_ereg_replace который многобайтовая (юникод) поддержка:

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