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

Статус
В этой теме нельзя размещать новые ответы.

dig555

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

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

Вопрос:
Как?

И ещё один вопросик. Возможно ли средствами PHP создавать поддомены третьего уровня?
 
Код:
# $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>';
	}
}
 
Большое спасибо за ответ. Но в регулярке я не зуб ногой. Как и в собственно 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? Чегой-то не чистит. Мне это скриптик нужен как "карманный" редактор кейвордов. Т.е. например когда я делаю доры под медицинскую партнёрку - парсер яндекса грабит для меня кеи вроде "порно гинеколог". Таким образом, я хочу внеся в файл с "плохими" словами слово "порно" - избавиться на выходе от таких кеев. Они мне очень мешают.
 
Код:
<? 
$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а-яА-Я] вместо а-яА-Я напиши список всех кириллических символов в обеих регистрах, т.к. они не все записываются через а-яА-Я (например, буквы ёЁ и украинское Її имеют коды меньшие чем а-яА-Я)


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

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

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

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

Тогда, если положить в public_html .htaccess с rewrite rules для дописывания в запрошенный uri каталога с именем поддомена (или не дописывания ничего, если запрошен сам домен), получим автоматическую работу всех возможных поддоменов. Т.е. вообще не возникает вопроса "как создавать поддомены", ибо любой возможный поддомен уже работает :)
 
Отлично. Всё работает как нужно. :yahoo:Побольше бы на этом форуме таких грамотных людей. ;)
 
+чтобы правильно работало со ВСЕМИ кириллическими символами, внутри [^a-zA-Zа-яА-Я] вместо а-яА-Я напиши список всех кириллических символов в обеих регистрах, т.к. они не все записываются через а-яА-Я (например, буквы ёЁ и украинское Її имеют коды меньшие чем а-яА-Я)

А вот ещё такой вопросик. По имеющимся данным
Яндекс подменяет некоторые буквы типа "о" и "а" на английские. Внешне разницы не видно, но зато роботу вычислять доры самый кайф.
Как выкинуть из списка латиницу, или заменить схожие по написанию буквы с латинских на кириллические?
 
+чтобы правильно работало со ВСЕМИ кириллическими символами
чтобы с кирилицей работать на "ты" надо использовать set_locale()
 
чтобы с кирилицей работать на "ты" надо использовать set_locale()

невнимательное чтение постов приводит к флуду. что сказать...


Как выкинуть из списка латиницу, или заменить схожие по написанию буквы с латинских на кириллические?

Замена схожих по написанию (выполняем после 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


хотя как ни изголяйся, всегда найдутся "художники слова" и обойдут фильтр )
 
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');
?>
 
сори, Sergeknsk, обвинил во флуде, забыв, что в той же koi8 кириллица идет не от а до я, а вразброс.

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


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