Поиск и замена части элементов массива

Статус
В этой теме нельзя размещать новые ответы.
Спасибо большое за дискуссию по проблеме. Резюмируя - вот тот код, который решает описанную проблему.
PHP:
//Массив, содержащий русские буквы, сходные по начертанию с английскими, маленькую "к" можно не включать сюда
$rus = array( "А", "а", "В", "Е", "е", "К", "к", "М", "Н", "О", "о", "Р", "р", "С", "с", "Т", "Х", "х");
//Массив английских букв, сходных по начертанию с русскими, маленькую "k" тоже можно и не включать, конечно
$eng = array("A", "a", "B", "E", "e", "K", "k", "M", "H", "O", "o", "P", "p", "C", "c", "T", "X", "x");
//Замена англ. букв русскими
$rus_words = str_replace ($eng, $rus, $words);
Фактически на практике достаточно найти латинские символы в файле со словами и заменить на кириллицу.
Как бы это присовокупить к вышенаписанному скрипту?
 
На мой взгляд:
PHP:
<?php
   $filename="file.txt";     //файл со строками 
   $lines=file($filename); 
   $bad="badwords.txt";      //плохие слова 
   $badwords=file($bad); 
   foreach ($lines as $line) {
      foreach ($badwords as $badword) {
         if (strpos(rulat($line),rulat($badword))!==false) continue 2;
      }
      $newlist[] = $line;
      echo $line.'<br />';
   }

   function rulat($words) {
      //Массив, содержащий русские буквы, сходные по начертанию с английскими, маленькую "к" можно не включать сюда 
      $rus = array( "А", "а", "В", "Е", "е", "К", "к", "М", "Н", "О", "о", "Р", "р", "С", "с", "Т", "Х", "х"); 
      //Массив английских букв, сходных по начертанию с русскими, маленькую "k" тоже можно и не включать, конечно 
      $eng = array("A", "a", "B", "E", "e", "K", "k", "M", "H", "O", "o", "P", "p", "C", "c", "T", "X", "x"); 
      //Замена англ. букв русскими 
      return str_replace ($eng, $rus, $words); 
   }
?>

В результате массив $newlist[] будет содержать все строки, где нет ни одного "бэдворд" + выведен на экран по условию задачи
 
Всё очень красиво! Только не работает.:ah: По крайней мере на Денвере. Побегу тестировать на *nix'овом хостинге.
Ну вот, например, строка с латинским "k", которое даже визуально отличается от русского "к" всё равно вылазит в браузер.
скачать букву1
сkачать букву2
скачать
скaчать тупо
скачать тупо2
скачать бесплатно
скачать игры
mp3 скачать
скачать фильмы
музыка скачать
скачать программы
скачать книгу
порно скачать
скачать песню
скачать песни
рефераты скачать
драйвера скачать
Во вложенном архиве несколько слов с заведомо изменёнными буквами, файл со скриптом, файл с плохими словами.
 

Вложения

  • clear.zip
    1,2 KB · Просмотры: 7
Всё очень красиво! Только не работает. По крайней мере на Денвере. Побегу тестировать на *nix'овом хостинге.
Ну вот, например, строка с латинским "k", которое даже визуально отличается от русского "к" всё равно вылазит в браузер.
я что-то пропустил?
в файле badwords.txt твоего архива слово "скачать" не значится, поэтому и проходит в любой комбинации.

В чём вопрос? И при чем тут буква "k" ?
 
Возможно не совсем корректно выразился. Скрипт mentanos отлично очищает от всех badwords. Кроме того, в очищенном массиве следует заменить все латинские буквы, схожими по написанию с кириллическими - на кирилличесике. Листинг кода замены мной приведён. Задача состояла в объединении скриптов. Чтобы исходный файл со словами не содержал "плохих" слов, а все слова в которых были спрятаны "не те" буквы обрели своё нормальное написание. Поэтому я и привёл пример с латинской "k" в выдаче скрипта.
 
Сори, я видать не туда глядел :)

Добавил одну строку, итого:
PHP:
<?php
   $filename="file.txt";     //файл со строками 
   $lines=file($filename); 
   $bad="badwords.txt";   //плохие слова 
   $badwords=file($bad); 
   foreach ($lines as $line) {
      foreach ($badwords as $badword) {
         $line = rulat($line);
         if (strpos($line,$badword)!==false) continue 2;
      }
      $newlist[] = $line;
      echo $line.'<br />';
   }

   function rulat($words) {
      //Массив, содержащий русские буквы, сходные по начертанию с английскими, маленькую "к" можно не включать сюда 
      $rus = array( "А", "а", "В", "Е", "е", "К", "к", "М", "Н", "О", "о", "Р", "р", "С", "с", "Т", "Х", "х"); 
      //Массив английских букв, сходных по начертанию с русскими, маленькую "k" тоже можно и не включать, конечно 
      $eng = array("A", "a", "B", "E", "e", "K", "k", "M", "H", "O", "o", "P", "p", "C", "c", "T", "X", "x"); 
      //Замена англ. букв русскими 
      return str_replace ($eng, $rus, $words); 
   }
?>
 
Отлично! Теперь буквы заменяются как им и положено. :yahoo:

А вот объединённый скрипт.
PHP:
<?php
   $filename="file.txt";     //файл со строками
   $lines=file($filename);
   $bad="badwords.txt";   //плохие слова
   $badwords=file($bad);

   function rulat($words) {
      //Массив, содержащий русские буквы, сходные по начертанию с английскими, маленькую "к" можно не включать сюда
      $rus = array( "А", "а", "В", "Е", "е", "К", "к", "М", "Н", "О", "о", "Р", "р", "С", "с", "Т", "Х", "х");
      //Массив английских букв, сходных по начертанию с русскими, маленькую "k" тоже можно и не включать, конечно
      $eng = array("A", "a", "B", "E", "e", "K", "k", "M", "H", "O", "o", "P", "p", "C", "c", "T", "X", "x");
      //Замена англ. букв русскими
      return str_replace ($eng, $rus, $words);
   }

   foreach ($badwords as $k => $v) {
   $badwords[$k] = trim($v);
   }

   $lines = rulat($lines);
   $badwords = array_flip($badwords);
   foreach ($lines as $v) {
   $s = trim(preg_replace('/([^a-zA-Zа-яА-Я]{1,})/',' ',$v));
   $s = array_flip(explode(' ',$s));
   $is_ok = true;
   foreach ($s as $k => $fix) {
   if (isset($badwords[$k])) {
   $is_ok = false;
   break;
   }
   }
   if ($is_ok) {
   echo $v.'<br>';
   }
   }
?>

Теперь осталось это прикрутить к любимому парсеру и куча времени сэкономлена. Кроме того исчезнет одна из возможных причин бана.
 
Нужно попросить хостера (или самому это сделать, если панель управления такое реализует) вписать для твоего домена в конфиг ns-сервера правило A (или CNAME) для поддомена * (чтобы ns-сервер опознавал все возможные поддомены) и в конфиг http-сервера вписать правило, что *.твойдомен - alias твоего домена (чтобы http-запросы на все возможные поддомены принимались).

Пусть корень твоего сайта находится в каталоге public_html. Сайты поддоменов будем располагать в каталогах вида public_html/поддомен.

Тогда, если положить в public_html .htaccess с rewrite rules для дописывания в запрошенный uri каталога с именем поддомена (или не дописывания ничего, если запрошен сам домен), получим автоматическую работу всех возможных поддоменов. Т.е. вообще не возникает вопроса "как создавать поддомены", ибо любой возможный поддомен уже работает :)
Хостер прописал мне нужное правило (wildcard dns). А теперь вот, как отредактировать .htaccess ?
Такая конструкция пойдёт
Код:
IndexIgnore .htaccess */.??* *~ *# */HEADER* */README* */_vti*
<Limit GET POST>
order deny,allow
deny from all
allow from all
</Limit>
<Limit PUT DELETE>
order deny,allow
deny from all
</Limit>
AuthName mysite.ru
AuthUserFile /home/mysite/public_html/_vti_pvt/service.pwd
AuthGroupFile /home/mysite/public_html/_vti_pvt/service.grp

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.mysite.ru
RewriteCond %{HTTP_HOST} !^cgi-bin\.mysite\.ru$
RewriteCond %{HTTP_HOST} ^(www\.)?(([^\.]+)\.){1}mysite.ru$
RewriteCond /home/mysite/public_html/%3 -d
RewriteRule ^/(.*) /%3/$1
 
и в конфиг http-сервера вписать правило
все класно и правильно, но на практике у многих хостеров возникает ступор когда их просят чтото в конфиге ручками править. Я лично эту задачу решаю проще но дороже:
также как и у тебя прописываю A * но просто беру выделенный ip? предварительно убедившись что все запросы по этому ip пойдут на мой сайт. Конечно на бакс дороже (а то и полтора) но зато нет проблем с уламыванием хостера... ну и плюс ip отдельный часто приятнее
 
Отлично! Теперь буквы заменяются как им и положено. :yahoo:

А вот объединённый скрипт.
...
Теперь осталось это прикрутить к любимому парсеру и куча времени сэкономлена.

А если еще добавить пару функций получится синонимизатор и псевдо генератор уникального тектста. :aga:
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху