Мне надо сделать фильтр, который за место заданных слов будет вставлять допустим CENSORED, в принципе ни чего сложного, выглядит это примерно как то так: Код (PHP): function words_filter($content) { $regexp = ' .... '; // регулярное выражение с перечнем return preg_replace($regexp, 'CENSORED',$content); } вопрос к знатокам, если этот список будет слишком большой, как это будет сказываться на производительности? К примеру по мимо неприличных слов там будет перечень запрещенных сайтов (говорят закон вступил в силу что за ссылки на запрещенные сайты (торренты там..), будут блокировать и твой сайт). Допустим если регулярное выражение будет где то на 1 мб.
речь не идет что я буду сидеть и писать выражение длинною в 1 мб, допустим с определенного сайта (роскомнадзор или как там) будет автоматически браться информация о запрещенными сайтами и добавлять в выражение, ссылки нынче длинные, сайтов много, я думаю наберется и больше чем на 1 мб. Я в регулярных выражениях не шарую, можете написать регулярное выражение на замену допустим URL, по тематике такое или такое, я расширю до 1 мб и затестирую
нет к сожалению, а что еще? или как говорили студенты-наркоманы, а че есть че? короче preg_replace отказывается работать: Код (PHP): $str = ' ... '; // тут много текста $data = file_get_contents('reg.txt'); // тут все нормально, контент получаем $reg = '~(?:'.$data.')~ixu'; // тут тоже все нормально // примерно такой вид: '~(?:test_0.ru|test_1.ru|test_2.ru)~ixu' // только этих тестов до 100 000 штук.. $new_str = preg_replace($reg, 'WORK!', $str); // результат - $new_str пустая переменная
str_replace что ли? мне казалось регулярным выражением и preg_replace проще и быстрее или это не так?
аргументируй как замена по регулярке может быть "проще и быстрей", чем буквальная замена подстроки. прямо заинтриговал.
Думать надо меньше, больше надо искать Почитай документацию пыха по регуляркам. Там они отдельно пишут, что, если задача тривиальная, то лучше использовать нативные строковые функции, нежели регекспы раскочегаривать.
Ну по всей видимости ты так НЕ думал. Еще печальнее, что очень много таких. Почему ты думал, что создать сложную регулярку которая еще и будет парситься хитрым образом быстрее, чем просто скормить массив слов? Ты врушка. Ты вообще не знал про str_replace
Че то не работает, не заменяет, подскажите в чем косяк: Код (PHP): $str = 'one test_40.ru two'; $lines = file('data.txt'); // в файле присутствует в том числе test_40.ru // полученный массив имеет вид: [0] => 'test_0.ru', [1] => 'test_1.ru' и т.д. // с массивом все в порядке, он есть, проверено $str = str_replace( $lines,'[!WORK!]',$str); echo "<p>{$str}</p>"; // выводит 'one test_40.ru two', а должно 'one [!WORK!] two' оба файла UTF-8
ну для начала попробуй подумать, как проверить, что оно работает. для начала проверь, что сама функция работает. потом проверь что файл читается в массив и он массив =) Добавлено спустя 24 секунды: чета делать надо, чувак нельзя ж просто так сидеть и говорить "ебать, нифига не пашет"
ну я проверил, то что у меня попало в $lines я вывел, это массив, если $lines засунуть в var_export то пишет Код (Text): array ( 0 => 'test_0.ru ', 1 => 'test_1.ru ', 2 => 'test_2.ru ', 3 => 'test_3.ru, ... ) если в var_export засунуть $lines[0] выводит test_0.ru куда дальше то рыть? вроде все ок.
http://php.ru/manual/function.file.html http://php.ru/manual/function.str-replace.html Попробуй сравнить кодировки $search и $subject.
Выискал в интернете, надо писать: Код (PHP): $lines = file('data.txt', FILE_IGNORE_NEW_LINES); Мне помогло.
кого интересуют результаты моих происков: массив из 1 000 000 элементов ($search), текст около 10 000 символов (присутствует всего 1 вхождение) ($subject) по времени выполнения ( microtime(true) ) - от 0.15 до 0.2 сколько использует памяти думаю нет смысла писать, т.к. я толком не въезжаю как эта функция работает, а оно у меня показывает всегда одно и то же значение. Это НЕ локальный сервер, а хостинг, причем не самый лучший. PS это нормально результат?