Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Отфильтровать строку от ненужных символов с заменой
 
 автор: TetRiska   (31.03.2011 в 22:41)   письмо автору
 
 

Всем доброй ночи. Помогите отфильтровать вот такую строку:
&quot;fff/\\\ \&nbsp;ааа68= quota .   <br>  <br/>    lol \ \яяявс12hEEllo0o+_-)(*&^%$#@!~`«»—•

Должно получится:
fff-ааа68-lol-яяявс12hEEllo0o

т.е. убираем любой символ или хтмл-сущность, который не принадлежит одному из 3-х алфавитов: укр., ру, енгл.
Надеюсь на Вашу помощь.

  Ответить  
 
 автор: cheops   (31.03.2011 в 22:59)   письмо автору
 
   для: TetRiska   (31.03.2011 в 22:41)
 

Можно начать отталкиваться от следующего скрипта (украинский нужно добавить)
<?php
  $text 
"&quot;fff/\\\ \&nbsp;ааа68= quota .   <br>  <br/>    lol \ \яяявс12hEEllo0o+_-)(*&^%$#@!~`&#178;&#8993;..";
  
// Сначала удаляем символы вида &nbsp;
  
$text preg_replace("|&[a-z]+;|is"""$text);
  
// Удаляем тэги
  
$text preg_replace("|<[^>]+>|is"""$text);
  
// Удлаяем все кроме цифр, букв и тире
  
$text preg_replace("|[^-a-z0-9а-яё]+|is"""$text);
  echo 
htmlspecialchars($text);
?>

  Ответить  
 
 автор: TetRiska   (01.04.2011 в 11:20)   письмо автору
 
   для: cheops   (31.03.2011 в 22:59)
 

Ваш вариант несовсем нужное выдает на выходе...Прошу подправить этот.
$text = "&quot;fff/\\\ \&nbsp;ааа68= quota .   <br>  <br/>    lol \ \яяявс12hEEllo0o+_-)(*&^%$#@!~`«»—•";

$translit = array(
    "а"=>"a","б"=>"b","в"=>"v","г"=>"g","ґ"=>"g","д"=>"d",
    "е"=>"e","є"=>"e","ё"=>"e","ж"=>"zh","з"=>"z","и"=>"i",
    "і"=>"i","ї"=>"i","й"=>"i","к"=>"k","л"=>"l","м"=>"m","н"=>"n",
    "о"=>"o","п"=>"p","р"=>"r","с"=>"s","т"=>"t","у"=>"u",
    "ф"=>"f","х"=>"h","ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch",
    "ъ"=>"","ы"=>"y","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya", "ей"=>"yei"
);

$text = strip_tags($text);

$text = strtr(mb_strtolower($text,"UTF-8"),$translit);

$text = preg_replace("|&[a-z]+;|is", "", $text);
$text = preg_replace("|[^\w\d]|iu", "", $text);

echo $text;

Сперва я перевожу на латынь, а потом отсекаю все что не латынь. Но одно но - в конце появляется подчеркивание
fffaaa68quotalolyayayavs12heello0o_

и еще нужно ставить тире там где был пробел, результат должен быть таким:
fff-aaa68-quota-lol-yayayavs12heello0o

Надеюсь на Вашу помощь, заранее благодарен.

  Ответить  
 
 автор: cheops   (01.04.2011 в 11:57)   письмо автору
 
   для: TetRiska   (01.04.2011 в 11:20)
 

Можно модифицировать скрипт следующим образом
<?php 
  $text 
"&quot;fff/\\\ \&nbsp;ааа68= quota .   <br>  <br/>    lol \ \яяявс12hEEllo0o+_-)(*&^%$#@!~`&#178;&#8993;.."
  
// Сначала удаляем символы вида &nbsp; 
  
$text preg_replace("|&[a-z#0-9]+;|is"""$text); 
  
// Удаляем тэги 
  
$text preg_replace("|<[^>]+>|is"""$text); 
  
// Удлаяем все кроме цифр, букв и тире 
  
$text preg_replace("|[^-a-z0-9а-яё ]+|is"""$text); 
  
// Заменяем пробелы на тире
  
$text preg_replace("|\s+|is""-"trim($text"-"));
  
// Выполняем транслитацию
  
$translit = array( 
    
"а"=>"a","б"=>"b","в"=>"v","г"=>"g","ґ"=>"g","д"=>"d"
    
"е"=>"e","є"=>"e","ё"=>"e","ж"=>"zh","з"=>"z","и"=>"i"
    
"і"=>"i","ї"=>"i","й"=>"i","к"=>"k","л"=>"l","м"=>"m","н"=>"n"
    
"о"=>"o","п"=>"p","р"=>"r","с"=>"s","т"=>"t","у"=>"u"
    
"ф"=>"f","х"=>"h","ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch"
    
"ъ"=>"","ы"=>"y","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya""ей"=>"yei");
  
$text strtr($text$translit);

  echo 
htmlspecialchars($text); 
?>

  Ответить  
 
 автор: TetRiska   (01.04.2011 в 13:09)   письмо автору
 
   для: cheops   (01.04.2011 в 11:57)
 

ваш вариант хорош если:
$text = strtr(mb_strtolower($text,'utf-8'), $translit);

т.к. у меня утф-8, но если поставим строку такого характера:
$text = "&quot;fff/\\\ \&nbsp;ааа68= quota . •_  <br>  <br/>`~1!2@3#4$5%6^7&8*9(0)_-)=+\|{[}]':;?.<,   ^ {[ lol \ \яяявс12hEEllo0o+_-)(*&^%$#@!~`«»—•";

все слетит
fff-aaa68-quota--1234567890--lol-yayayav12heello0o-»

  Ответить  
 
 автор: cheops   (01.04.2011 в 13:29)   письмо автору
 
   для: TetRiska   (01.04.2011 в 13:09)
 

Для начала, функция strtr() не поддерживает многобайтовые кодировки - нужно искать какое-то другое решение.

  Ответить  
 
 автор: TetRiska   (01.04.2011 в 13:44)   письмо автору
 
   для: cheops   (01.04.2011 в 13:29)
 

чем лучше утф-8 от обычной виндовс-1251? а то много нюансов возникает с ней ((

  Ответить  
 
 автор: cheops   (01.04.2011 в 14:00)   письмо автору
 
   для: TetRiska   (01.04.2011 в 13:44)
 

Поддержкой нескольких языков на одном сайте.

  Ответить  
 
 автор: TetRiska   (01.04.2011 в 14:29)   письмо автору
 
   для: cheops   (01.04.2011 в 14:00)
 

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

  Ответить  
 
 автор: Deed   (01.04.2011 в 21:18)   письмо автору
 
   для: cheops   (01.04.2011 в 14:00)
 

:)
Промолчу лишь из одного уважения к Вам, cheops. Windows-1251 поддерживает даже суахили и узелковую письменность майя.
Я, к примеру, делаю MySQL на utf-8, a паги сайтов на win-1251 и НИКОГДА не было НИКАКИХ проблем.
Но молчу-молчу...

  Ответить  
 
 автор: cheops   (01.04.2011 в 23:09)   письмо автору
 
   для: Deed   (01.04.2011 в 21:18)
 

Тем более мы все в прошлой теме обговорили. Да, utf-8 тяжелый и не удобный, особенно в PHP, разработчики которого грозятся поддержкой UTF-8 на уровне ядра уже лет эдак 7 и базу данных он раздувает в два раза, а увеличение размера таблицы с 500Мб до 1Гб на производительности отражается прилично. Однако, когда нужно одним движком сохранять в одной таблице текст на разных языках и корректно его потом извлекать из базы данных (пользуясь сортировкой по ORDER BY) ничего лучше UTF-8 нет. Мы и так и так сайты многоязычные сайты разрабатывали - с UTF-8 быстрее, удобнее, надежнее (не смотря на все но).

  Ответить  
 
 автор: Deed   (02.04.2011 в 00:03)   письмо автору
31.4 Кб
 
   для: cheops   (01.04.2011 в 23:09)
 

Мы немного не поняли друг друга.
Ничто не мешает делать базы на utf-8, но страницы выводить в удобном и простом windows-1251.
Я где-то год назад сделал себе тестовый сайт на платном хостинге. Он был как бы лабораторной работой, когда я интереса ради решил освоить php.
На приведенной картинке я специально для Вас написал одну и ту же фразу на разных языках и вывел ее без проблем в комментарии.

  Ответить  
 
 автор: cheops   (02.04.2011 в 00:39)   письмо автору
 
   для: Deed   (02.04.2011 в 00:03)
 

Это да, согласен.

  Ответить  
 
 автор: Deed   (01.04.2011 в 12:48)   письмо автору
 
   для: TetRiska   (31.03.2011 в 22:41)
 


<?
$text 
"&quot;fff/\\\ \&nbsp;ааа68= quota .  <br>  <br/>    lol \ \яяявс12hEEllo0o+_-)(*&^%$#@!~`«»—•";


function 
unhtmlentities ($string)   //функция, обратная htmlentities
{
    
$trans_tbl get_html_translation_table (HTML_ENTITIES);
    
$trans_tbl array_flip ($trans_tbl);
    return 
strtr ($string$trans_tbl);
}



$text=unhtmlentities($text);
$text=strip_tags($text);
$text=preg_replace("/(?<==).+?(?=\s)/","",$text);
$text=preg_replace(" /[^a-zA-Z\d\sа-яА-Я]+/i","",$text);  //ибо \w включает в себя нижнее тире "_"
$text=preg_replace("/\s+/","-",$text);

echo 
$text;   //fff-ааа68-lol-яяявс12hEEllo0o 
?>

  Ответить  
 
 автор: TetRiska   (01.04.2011 в 13:05)   письмо автору
 
   для: Deed   (01.04.2011 в 12:48)
 

ваш пример мне выдал
fff-ааа68-lol-яяяв&#65533;12hEEllo0o«»—•

кодировка у меня страницы утф-8

  Ответить  
 
 автор: Deed   (01.04.2011 в 13:19)   письмо автору
 
   для: TetRiska   (01.04.2011 в 13:05)
 

Попробуйте

<?
$text
=preg_replace(" /[^a-zA-Z\d\sа-яА-Я]+/Ui","",$text);
?>

  Ответить  
 
 автор: TetRiska   (01.04.2011 в 13:34)   письмо автору
 
   для: Deed   (01.04.2011 в 13:19)
 

fff-ааа68-lol-яяяв&#65533;12hEEllo0o«»—•

  Ответить  
 
 автор: Deed   (01.04.2011 в 13:44)   письмо автору
 
   для: TetRiska   (01.04.2011 в 13:34)
 

http://punbb.ru/post1005.html

  Ответить  
 
 автор: TetRiska   (01.04.2011 в 13:53)   письмо автору
 
   для: Deed   (01.04.2011 в 13:44)
 

если поставить кодировку документа вин-1251 то будет как у тебя в результате, долбаный утф, как быть-то?

  Ответить  
 
 автор: TetRiska   (01.04.2011 в 16:10)   письмо автору
 
   для: TetRiska   (01.04.2011 в 13:53)
 

в общем сделал очистку и еще ко всем вопрос - как бы можно упростить? а то пришлось делать массив, чтобы проставить тире вместо пробелов, которые были в строке
$text = "&quot;fff/\\\ \&nbsp;ааа68 9= quota . •_  <br>  <br/>`~1!2@3#4$5%6^7&8*9(0)_-)=+\|{[}]':;?.&lt;,   ^ {[ lol \ \яяявс12hEEllo0o+_-)(*&^%$#@!~`«»—•— —  —– – -- - &quot; &mdash;&ndash; &ndash; ?% % №";

$replace = array(
  "а"=>"a","б"=>"b","в"=>"v","г"=>"g","ґ"=>"g","д"=>"d",
  "е"=>"e","є"=>"e","ё"=>"e","ж"=>"zh","з"=>"z","и"=>"i",
  "і"=>"i","ї"=>"i","й"=>"i","к"=>"k","л"=>"l","м"=>"m","н"=>"n",
  "о"=>"o","п"=>"p","р"=>"r","с"=>"s","т"=>"t","у"=>"u",
  "ф"=>"f","х"=>"h","ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch",
  "ъ"=>"","ы"=>"y","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya", "ей"=>"yei"
);

$text = strip_tags($text);
$text = strtr(mb_strtolower($text,"UTF-8"),$replace);
$text = preg_replace("|&[a-z]+;|is", "", $text);
$text = preg_replace("|[^a-z0-9 ]|is", "", $text);

$mass = explode(" ",trim($text));
$count = count($mass);
$p = 0;
for($i=0;$i<$count;$i++){
    $p++;
    $add = ($p !=  $count)?"-":"";
    if($mass[$i] != ''){
        $text2 .= $mass[$i].$add;
    }
}

echo $text2;

долгожданный результат
fff-aaa68-9-quota-1234567890-lol-yayayavs12heello0o

  Ответить  
 
 автор: Deed   (01.04.2011 в 18:51)   письмо автору
 
   для: TetRiska   (01.04.2011 в 16:10)
 

Вот именно, "долбаный утф!"
И страницы тяжелее, и нюансов тьма. Никому не нужных нюансов!

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

  Ответить  
 
 автор: TetRiska   (02.04.2011 в 16:42)   письмо автору
 
   для: Deed   (01.04.2011 в 18:51)
 

все, решил вопрос)

  Ответить  
 
 автор: Deed   (02.04.2011 в 18:43)   письмо автору
 
   для: TetRiska   (02.04.2011 в 16:42)
 

С девушкой? :)
В принципе, нежадное U можно было воткнуть в каждую регулярку. Иногда чудеса случались. На машинном уровне.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования