Удаление символов из строки PHP - PullRequest
0 голосов
/ 06 октября 2009

Я принимаю строку из ленты для отображения на экране, которая может содержать или не содержать мусор, который я хочу отфильтровать. Я вообще не хочу фильтровать нормальные символы.

Значения, которые я хочу удалить, выглядят так:

Я хочу удалить только это. Соответствующей технологией является PHP.

Предложения приветствуются.

Ответы [ 8 ]

6 голосов
/ 06 октября 2009

Это проблема кодирования; Вы не должны пытаться убрать этих поддельных персонажей, но должны понимать, почему вы получаете их зашифрованные.

Попробуйте получить данные в формате Unicode или заключить соглашение с вашим провайдером каналов, чтобы вы оба использовали одну и ту же кодировку.

1 голос
/ 06 октября 2009

Спасибо за ответы, ребята. К сожалению, у представленных были следующие проблемы:

неправильно по очевидным причинам:

ereg_replace("[^A-Za-z0-9]", "", $string);

Это:

s/[\u00FF-\uFFFF]//

, который также использует устаревшую форму регулярного выражения ereg, также не работал, когда я конвертировал в preg, потому что диапазон был слишком велик для обработки регулярного выражения. Кроме того, в этом диапазоне есть отверстия, которые позволили бы мусору просачиваться.

Это предложение:

Это проблема кодирования; Вы не должны пытаться убрать этих поддельных персонажей, но должны понимать, почему вы получаете их зашифрованные.

хотя и действителен, но не годится, потому что я не контролирую, как кодируются получаемые мной данные. Это исходит из внешнего источника. Иногда там есть мусор, а иногда его нет.

Итак, решение, которое я нашел, было относительно грязным, но в отсутствие чего-то более надежного я просто принимаю все стандартные буквы, цифры и символы и отбрасываю остальные.

Кажется, сейчас это работает. Решение заключается в следующем:

$fixT = str_replace("£", "£", $string); 
$fixT = str_replace("€", "€", $fixT);
$fixT = preg_replace("/[^a-zA-Z0-9\s\.\/:!\[\]\*\+\-\|\<\>@#\$%\^&\(\)_=\';,'\?\\\{\}`~\"]/", "", $fixT);

Если у кого-то есть идеи получше, я все равно хочу их услышать. Приветствия.

0 голосов
/ 24 апреля 2012

Привет друзья,

     try this Regular Expression to remove unicode char from the string : 

     /*\\u([0-9]|[a-fA-F])([0-9]|[a-fA-F])([0-9]|[a-fA-F])([0-9]|[a-fA-F])/ 

Спасибо, Chintu (prajapati.chintu.001@gmail.com)

0 голосов
/ 07 октября 2009

Попробуйте это:

  • Загрузить образец из корма вручную.
  • Откройте его в Блокноте ++ или другом расширенном текстовом редакторе (для этого подойдет KATE в Linux).
  • Попробуйте изменить кодировку и преобразовать кодировку из одной в другую.

Если вы найдете параметр, обеспечивающий правильное отображение символов, вам нужно либо закодировать свой сайт в этой кодировке, либо преобразовать его из этой кодировки во все, что вы используете на своем сайте.

0 голосов
/ 06 октября 2009

Посмотрите на этот вопрос , чтобы получить значение каждого байта в вашей строке. (Предполагается, что многобайтовая перегрузка отключена.)

Когда у вас есть байты, вы можете использовать их, чтобы определить, что на самом деле представляют собой эти "мусорные" символы. Возможно, они являются результатом неправильной интерпретации кодировки строки или отображения ее неправильным шрифтом, или чего-то еще. Опубликуйте их здесь, и люди могут помочь вам в дальнейшем.

0 голосов
/ 06 октября 2009

Вам будет трудно это сделать, поскольку у вас нет четкого определения того, что фильтровать и что сохранять. Как правило, символы, которые отображаются в виде пустых квадратов, - это все, что у используемой вами гарнитуры не имеет глифа, поэтому определение «вещи, которые отображаются следующим образом: » ужасно неточно.

Было бы гораздо лучше решить, какие именно символы являются действительными (в любом случае это всегда хороший подход при любой очистке данных) и отбросить все, что не входит в число этих. Функция PHP filter - это одна из возможностей сделать это, в зависимости от требуемого уровня сложности и надежности.

0 голосов
/ 06 октября 2009

Вы ищете символы, которые находятся за пределами диапазона глифов, которые может отображать ваш шрифт. Вы можете найти максимальное значение Unicode, которое может отображать ваш шрифт, а затем создать регулярное выражение, которое заменит все значение выше этого значения пустой строкой. Примером будет

s/[\u00FF-\uFFFF]//

Это лишит все, что выше символа 255.

0 голосов
/ 06 октября 2009

Если вы не можете решить проблему с данными из канала и вам необходимо отфильтровать информацию, это может помочь:

PHP5 filter_input очень хорош для фильтрации входных строк и обеспечивает достаточную гибкость

filter_input(input_type, variable, filter, options) 

Вы также можете отфильтровать все данные формы в одной строке, если требуется такая же фильтрация:)

Здесь есть несколько хороших примеров и дополнительной информации:

http://www.w3schools.com/PHP/func_filter_input.asp

На сайте PHP есть больше информации об опциях здесь: Фильтры проверки

...