2009-10-06 5 views
-1

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

Значения Я хочу удалить выглядеть следующим образом:

Только это, что я хочу удалить. Релевантная технология - это PHP.

Предложения оценены.

+4

Каковы эти символы? Такая проблема, как правило, исходит из неверно кодированных данных. Возможно, вам лучше решить эту проблему, чем просто удалить материал, который вы не можете прочитать. Возможно, они скрывают * фактический * контент. –

+0

Наверное, Доминик. Но я не могу контролировать, как эти данные поступают, поэтому я не знаю. – Evernoob

ответ

1

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

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

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

Это:

s/[\u00FF-\uFFFF]// 

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

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

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

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

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

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

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

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

+1

Третья строка вашего решения, вероятно, может быть изменена на [^ -ÿ], что является символом пробела через 255-й символ. Он будет лишать строки, возврат каретки и вкладки, поэтому, если вы хотите оставить этот пробел, вы можете использовать [^ -ÿ \ t \ r \ n] или [^ -ÿ \ s] –

0

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

PHP5 filter_input очень хорошо для фильтрации входных строк и позволяет изрядное количество rlexability

filter_input(input_type, variable, filter, options) 

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

Есть некоторые хорошие примеры и более подробная информация об этом здесь:

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

РНР сайт содержит больше информации о параметрах здесь: Validation Filters

0

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

s/[\u00FF-\uFFFF]// 

Это лишит ничего выше характера 255.

+0

Это просто помощник Arial ... знаете ли вы, что такое максимальное значение для unicode? – Evernoob

+0

Просматривая набор в charmap, похоже, что Arial включает в себя множество символов Unicode, но есть некоторые дыры. Например, он перескакивает с 04E9 на 05B0, причем ни один из глифов между ними. Вам понадобится способ получить эту информацию из шрифта, просто выровняйте все выше определенного диапазона и поймите, что вы можете потерять информацию или решить проблемы с данными вверх по течению. Если он поступает из Office (который использует специальные символы quote/apostrophe), вы можете попробовать использовать шрифт Office. –

+0

Да. Я просто люблю это. И другая проблема с вышеупомянутым решением заключается в том, что regex отклоняет диапазон как слишком большой, чтобы соответствовать. – Evernoob

0

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

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

6

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

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

+0

Проблема в том, что у меня нет никакого контроля над тем, как поступают данные. Он приходит в том виде, в котором я его получаю, и моя работа - превратить его в состояние, подходящее для экрана. – Evernoob

+1

Затем измените свою кодировку в соответствии с исходным кодом –

+0

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

0

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

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

+0

Цените, что, но это корм, который меняется ежедневно. Сегодня мусорные персонажи будут заменены мусорными символами завтрашнего дня. – Evernoob

+0

Дело не в том, чтобы узнать, какими конкретными персонажами они являются. Дело в том, чтобы узнать, что * тип * символов, которыми они являются. Есть вероятность, что они на самом деле не мусор, но вы просто неправильно интерпретируете кодировку. Если это так, ваш лучший подход заключается не в том, чтобы вырезать их, а для правильного чтения кодировки. Но вы не узнаете, пока не посмотрите на данные. –

0

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

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

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

-1

Здравствуйте, друзья,

 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 ([email protected])

Смежные вопросы