1. Задавайте здесь вопросы о коде, которые не подходят в другие разделы, такие как:
    Дизайн > Верстка
    PHP > Как сделать на PHP
    Скрыть объявление

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

Тема в разделе "Web Coding", создана пользователем dig555, 2 янв 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. dig555

    dig555

    Регистр.:
    22 июн 2007
    Сообщения:
    362
    Симпатии:
    148
    Исходное:
    Есть массив. Каждый элемент - строка текста.
    Есть второй массив. Каждый элемент - "плохое" слово.

    Задача:
    Удалить из первого массива все строки в которых содержатся "плохие" слова из второго массива. Вывести очищенный массив в браузер в формате "каждый элемент "чистого" массива с новой строки".

    Вопрос:
    Как?

    И ещё один вопросик. Возможно ли средствами PHP создавать поддомены третьего уровня?
     
  2. mentanos

    mentanos Постоялец

    Регистр.:
    27 дек 2007
    Сообщения:
    128
    Симпатии:
    35
    Код:
    # $a - массив строк
    # $w - массив плохих слов
    $w = array_flip($w);
    
    foreach ($a 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($w[$k])) {
    			$is_ok = false;
    			break;
    		}
    	}
    	if ($is_ok) {
    		echo $v.'<br>';
    	}
    }
     
    dig555 нравится это.
  3. dig555

    dig555

    Регистр.:
    22 июн 2007
    Сообщения:
    362
    Симпатии:
    148
    Большое спасибо за ответ. Но в регулярке я не зуб ногой. Как и в собственно PHP. Вот что у меня получается:
    PHP:
    <?
    $filename="file.txt"//файл со строками
    $lines=file($filename);
    $bad="badwords.txt"//плохие слова
    $badwords=file($bad);
    $badw array_flip($badwords);
    foreach (
    $lines as $badw) {
    $s trim(preg_replace('/([^a-zA-Zа-яА-Я]{1,})/',' ',$badw));
    $s array_flip(explode(' ',$s));
    $is_ok true;
    foreach (
    $s as $k => $fix) {
    if (isset(
    $badw[$k])) {
    $is_ok false;
    break;
    }
    }
    if (
    $is_ok) {
    echo 
    $badw.'<br>';
    }
    }
    ?>
    Что за переменная $v? Чегой-то не чистит. Мне это скриптик нужен как "карманный" редактор кейвордов. Т.е. например когда я делаю доры под медицинскую партнёрку - парсер яндекса грабит для меня кеи вроде "порно гинеколог". Таким образом, я хочу внеся в файл с "плохими" словами слово "порно" - избавиться на выходе от таких кеев. Они мне очень мешают.
     
  4. mentanos

    mentanos Постоялец

    Регистр.:
    27 дек 2007
    Сообщения:
    128
    Симпатии:
    35
    Код:
    <? 
    $filename="file.txt"; //файл со строками 
    $lines=file($filename); 
    $bad="badwords.txt"; //плохие слова 
    $badwords=file($bad); 
    foreach ($badwords as $k => $v) {
    $badwords[$k] = trim($v);
    }
    $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>'; 
    } 
    } 
    ?>
    ######## upd
    в 11 строке скобка дописана
    ########

    +чтобы правильно работало со ВСЕМИ кириллическими символами, внутри [^a-zA-Zа-яА-Я] вместо а-яА-Я напиши список всех кириллических символов в обеих регистрах, т.к. они не все записываются через а-яА-Я (например, буквы ёЁ и украинское Її имеют коды меньшие чем а-яА-Я)


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

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

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

    Тогда, если положить в public_html .htaccess с rewrite rules для дописывания в запрошенный uri каталога с именем поддомена (или не дописывания ничего, если запрошен сам домен), получим автоматическую работу всех возможных поддоменов. Т.е. вообще не возникает вопроса "как создавать поддомены", ибо любой возможный поддомен уже работает :)
     
    dig555 нравится это.
  5. dig555

    dig555

    Регистр.:
    22 июн 2007
    Сообщения:
    362
    Симпатии:
    148
    Отлично. Всё работает как нужно. :yahoo:Побольше бы на этом форуме таких грамотных людей. ;)
     
  6. dig555

    dig555

    Регистр.:
    22 июн 2007
    Сообщения:
    362
    Симпатии:
    148
    А вот ещё такой вопросик. По имеющимся данным
    Как выкинуть из списка латиницу, или заменить схожие по написанию буквы с латинских на кириллические?
     
  7. Sergeknsk

    Sergeknsk Постоялец

    Регистр.:
    17 окт 2007
    Сообщения:
    50
    Симпатии:
    9
    чтобы с кирилицей работать на "ты" надо использовать set_locale()
     
  8. mentanos

    mentanos Постоялец

    Регистр.:
    27 дек 2007
    Сообщения:
    128
    Симпатии:
    35
    невнимательное чтение постов приводит к флуду. что сказать...


    Замена схожих по написанию (выполняем после preg_replace:(
    PHP:
    $latin 'ac'# латинские символы
    $cyril 'ас'# соотв. кириллические символы
    $s strtr($s,$latin,$cyril);
    это только пример. допиши в строки $latin и $cyril все символы, которые считаешь похожими


    с латиницей можно выполнить обратную транслитерацию по одному из общепринятых правил, например ГОСТ 7.79—2001 (выполняем после preg_replace:(

    PHP:
    $trans_back = array('shh' => 'щ','уа' => 'я','yo' => 'ё','yu' => 'ю','zh' => 'ж','ch' => 'ч','sh' => 'ш','kh' => 'х','cz' => 'ц','a' => 'а','b' => 'б','c' => 'ц','d' => 'д','e' => 'е','f' => 'ф','h' => 'х','i' => 'и','j' => 'й','k' => 'к','l' => 'л','m' => 'м','n' => 'н','o' => 'о','p' => 'п','q' => 'щ','r' => 'р','s' => 'с','t' => 'т','u' => 'у','v' => 'в','w' => 'ы','x' => 'х','y' => 'ы','z' => 'з');
    $s strtr($s,$trans_back);
    кстати, мы прошлый раз забыли упомянуть о регистре символов. наверняка плохие слова у тебя записаны в нижнем регистре. поэтому после foreach ($lines as $v) { первую строку стоит заменить на:
    PHP:
    $s trim(preg_replace('/([^a-zа-я]{1,})/',' ',strtolower($v)));
    и в самом начале файла прописать правильную локаль, чтобы strtolower корректно обрабатывала кириллицу. например setlocale(LC_ALL,'ru_RU.CP1251');, если у тебя кодировка windows-1251


    хотя как ни изголяйся, всегда найдутся "художники слова" и обойдут фильтр )
     
    dig555 нравится это.
  9. Sergeknsk

    Sergeknsk Постоялец

    Регистр.:
    17 окт 2007
    Сообщения:
    50
    Симпатии:
    9
    mentanos, почему флуд? И читаю внимательно, претензий никаких, только дополнение высказал, ибо без корректной локали (о чем в постах выше не было ни слова) работа функций с нестандартными кодировками нормально невозможна, собственно только это я и имел ввиду упомянув про setlocale().

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

    dig555, на счёт использования локали - стоит сначала определиться как она у хостера называется:
    Для Linux
    PHP:
    <?php
    //для вывода всех локалей 
    system('locale -a'); 
    //для вывода русских локалей 
    system('locale -a  | grep ru');
    ?>
    Для FreeBSD
    PHP:
    <?php
    //для вывода всех локалей 
    system('ls /usr/share/locale'); 
    //для вывода русских локалей
    system('ls /usr/share/locale | grep ru');
    ?>
     
    dig555 нравится это.
  10. mentanos

    mentanos Постоялец

    Регистр.:
    27 дек 2007
    Сообщения:
    128
    Симпатии:
    35
    сори, Sergeknsk, обвинил во флуде, забыв, что в той же koi8 кириллица идет не от а до я, а вразброс.

    локаль приписал для strtoupper, о которой сам же и вспомнил :pp


    может кто-то не в курсе, но большинство (вразумительных) хостеров отключают system и все прочее. из-под перла смотреть придется
     
Статус темы:
Закрыта.