За последние 24 часа нас посетили 15816 программистов и 1665 роботов. Сейчас ищут 805 программистов ...

Фильтр, замена слов

Тема в разделе "PHP для новичков", создана пользователем VLK, 4 июн 2014.

  1. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Мне надо сделать фильтр, который за место заданных слов будет вставлять допустим CENSORED, в принципе ни чего сложного, выглядит это примерно как то так:

    Код (PHP):
    1. function words_filter($content) {
    2. $regexp = ' .... '; // регулярное выражение с перечнем
    3. return preg_replace($regexp, 'CENSORED',$content);
    4. } 
    вопрос к знатокам, если этот список будет слишком большой, как это будет сказываться на производительности?

    К примеру по мимо неприличных слов там будет перечень запрещенных сайтов (говорят закон вступил в силу что за ссылки на запрещенные сайты (торренты там..), будут блокировать и твой сайт).

    Допустим если регулярное выражение будет где то на 1 мб.
     
  2. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    по сабжу ничего сказать не могу, но на метр регулярки я бы посмотрел )
     
  3. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    речь не идет что я буду сидеть и писать выражение длинною в 1 мб, допустим с определенного сайта (роскомнадзор или как там) будет автоматически браться информация о запрещенными сайтами и добавлять в выражение, ссылки нынче длинные, сайтов много, я думаю наберется и больше чем на 1 мб.

    Я в регулярных выражениях не шарую, можете написать регулярное выражение на замену допустим URL, по тематике такое или такое, я расширю до 1 мб и затестирую :)
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а че, кроме регулярок ничего не знаем больше? =)
     
  5. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    нет к сожалению, а что еще?
    или как говорили студенты-наркоманы, а че есть че?


    короче preg_replace отказывается работать:
    Код (PHP):
    1. $str = ' ... '; // тут много текста
    2.  
    3. $data = file_get_contents('reg.txt'); // тут все нормально, контент получаем
    4.  
    5. $reg = '~(?:'.$data.')~ixu'; // тут тоже все нормально
    6. // примерно такой вид:  '~(?:test_0.ru|test_1.ru|test_2.ru)~ixu'
    7. // только этих тестов до 100 000 штук..
    8.  
    9. $new_str = preg_replace($reg, 'WORK!', $str);
    10.  
    11. // результат - $new_str пустая переменная
    12.  
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    чувак. загугли замену слов в строке.
     
  7. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    str_replace что ли? мне казалось регулярным выражением и preg_replace проще и быстрее или это не так?
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    аргументируй как замена по регулярке может быть "проще и быстрей", чем буквальная замена подстроки. прямо заинтриговал.
     
  9. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    не знаю, я так думал :)
     
  10. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Думать надо меньше, больше надо искать:) Почитай документацию пыха по регуляркам. Там они отдельно пишут, что, если задача тривиальная, то лучше использовать нативные строковые функции, нежели регекспы раскочегаривать.
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Ну по всей видимости ты так НЕ думал. :D
    Еще печальнее, что очень много таких. Почему ты думал, что создать сложную регулярку которая еще и будет парситься хитрым образом быстрее, чем просто скормить массив слов? Ты врушка. Ты вообще не знал про str_replace

    :D
     
  12. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Че то не работает, не заменяет, подскажите в чем косяк:

    Код (PHP):
    1. $str = 'one test_40.ru two';
    2.  
    3. $lines = file('data.txt'); // в файле присутствует в том числе test_40.ru
    4. // полученный массив имеет вид: [0] => 'test_0.ru', [1] => 'test_1.ru' и т.д.
    5. // с массивом все в порядке, он есть, проверено
    6.  
    7. $str = str_replace( $lines,'[!WORK!]',$str);
    8.  
    9. echo "<p>{$str}</p>"; // выводит 'one test_40.ru two', а должно 'one [!WORK!] two'
    оба файла UTF-8
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    должно работать. попробуй ручками =) и проверь хоть что-нибудь =)
     
  14. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    попробовать что?
    работать должно, но что то не работает.
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну для начала попробуй подумать, как проверить, что оно работает. для начала проверь, что сама функция работает. потом проверь что файл читается в массив и он массив =)

    Добавлено спустя 24 секунды:
    чета делать надо, чувак
    нельзя ж просто так сидеть и говорить "ебать, нифига не пашет"
     
  16. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    ну я проверил, то что у меня попало в $lines я вывел, это массив, если $lines засунуть в var_export то пишет
    Код (Text):
    1. array ( 0 => 'test_0.ru ', 1 => 'test_1.ru ', 2 => 'test_2.ru ', 3 => 'test_3.ru, ... )
    если в var_export засунуть $lines[0] выводит test_0.ru

    куда дальше то рыть? вроде все ок.
     
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Чудеса!
     
  18. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Надо бы сделать trim, чтобы из lines убрать лишние пробелы, переводы строки и прочую чушь.
     
  19. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    http://php.ru/manual/function.file.html
    http://php.ru/manual/function.str-replace.html
    Попробуй сравнить кодировки $search и $subject.
     
  20. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Выискал в интернете, надо писать:
    Код (PHP):
    1. $lines = file('data.txt', FILE_IGNORE_NEW_LINES);  
    Мне помогло.
     
  21. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Ну хз... Помогло и слава богу))
     
  22. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    кого интересуют результаты моих происков:
    массив из 1 000 000 элементов ($search), текст около 10 000 символов (присутствует всего 1 вхождение) ($subject)

    по времени выполнения ( microtime(true) ) - от 0.15 до 0.2
    сколько использует памяти думаю нет смысла писать, т.к. я толком не въезжаю как эта функция работает, а оно у меня показывает всегда одно и то же значение.
    Это НЕ локальный сервер, а хостинг, причем не самый лучший.

    PS это нормально результат? :)
     
  23. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Элементов много