1. PHP / Говнокод #5289

    +162

    1. 1
    $text = preg_replace("#<a(.*?)\/a>|(h.*?:\/\/)?([a-z0-9- .]+\.[a-z ]*)#si","",$text);

    Регулярное выражение, задача которого уничтожить все существующие ссылки на сторонние сайты содержащиеся в переменной $text
    Друг посчитал, что коду место на этом ресурсе :)

    Запостил: wowerwower, 15 Января 2011

    Комментарии (27) RSS

    • Оно съест "i wanna be codemonkey."
      Друг правильно посчитал.
      Ответить
    • Уже только одно .*? чего стоит :)
      Ответить
      • тащемто нежадный астерикс (ноль-или-более) -- не самое страшное зло этого говнокода
        Ответить
        • Ну, остальное тоже не выполняет возложеной на него миссии, но оно по крайней мере чего-то делает, а в этом вообще просто лишний символ ("?" в таком случае ни на что не повлияет, или наоборот "*" не учтется, я не знаю как именно в PHP оно устроено).
          Ответить
    • ссылки через JS пройдут мимо
      Ответить
      • JS и прочий мусор режет другой фильтр
        function onlytext($text)
        {
        $text = preg_replace ("/[^0-9a-zA-Zа-яА-ЯёЁ \.,!@?%-:;()_+=&\n]/", "", $text);
        $text = str_replace ("'", "", $text);
        return trim($text);
        }
        Ответить
    • Переделал:
      preg_replace("#<a(.*?)\/a>|(http:\/\/|https:\/\/)?([a-z0-9-\.]+\.[a-z]{2,6})#si","",$text);
      Ответить
      • ftp://yandex.ru
        Ответить
        • и че? вопрос защиты не стоял резать домены с подобным протоколом, т.к. он уже мало распространен.
          Если принципиально, то его всегда можно добавить
          ftp:\/\/ и все.., но опять же он не добавлялся умышленно к тому же, вы сначало попробуйте, пройдет ли такой домен))
          Ответить
      • Mr.Smith
        Ответить
        • Да, подобные конструкции мы потеряем, зато домены без www и без http:// не пройдут, хотя есть решение, скоро сделаю
          Ответить
          • $text = preg_replace("#<a(.*?)\/a>|(ftp:\/\/|http:\/\/|https:\/\/)?[-a-z0-9\.]+\.(ru|by|ua|info|org|com|net|biz|name|g ov|tv)+#si","",$text);
            Готово. Фильтрует самые распространенные домены (кроме IDN), а текст не убивает и mr.smith тож оставит живым
            Ответить
            • Dr.Rubynov
              Ответить
              • Вероятность подобной конструкции крайне низка, но зач0т))
                Ответить
                • Не так низка, как ВНЕЗАПНА.

                  А вот ещё: &103;&111;&111;&103;&108;&101;&46;&99;&1 11;&109;
                  Ответить
            • .edu
              .РФ

              запилите полный список и положите в паблик. а еще напишите-ка твиттер клиент. их всегда недостаточно!
              Ответить
    • во первых, зачем убирать ссылки, оставляя хтмл? секуритифейл же.
      во-вторых, быть может, strip_tags или что-то вроде поможет?
      Ответить
      • Вы вообще разбираетесь в регулярке и в том, что тут написано? на мой взгляд - нет!
        <a(.*?)\/a> - вот эта часть убивает ссылки вместе с анкором.
        "зачем убирать ссылки, оставляя хтмл?" - вы может топиком ошиблись? )))) Связи ваших слов с представленным кодом вообще не наблюдается
        Ответить
        • Да, вот давно хотел спросить, что символизирует <a(.*?)\/a>? Можно пример соответствия? ;)
          Ответить
          • Если будет ссылка вида
            <a href='http://lobzikov.ru'>lobzikov.ru</a>
            или
            <a href='http://maxref.ru/referat_457_8.html'>Будщее науки</a>
            или
            <a href='http://maxref.ru/referat_457_9.html' title='Крутой реферат'>Крутой реферат</a>
            то этот паттерн его по-любому найдет и вырежет, если используется совместно с preg_replace и ему подобных ф-ций.

            Пример: $text = preg_replace("#<a(.*?)\/a>#si","",$text);
            Ответить
            • Ну кто бы подумал.

              <a name='step3'><h3>Шаг третий</h3></a>
              <abbr title='Говнокод'>ГК</abbr> <a href="http://govnokod&46;ru/5289">такой</a>
              <a href='http://lobzikov&46;ru'>lobzikov&46;ru</a >
              <a href='http://lobzikov&46;ru'>lobzikov&46;ru (конец фрагмента)
              Ответить
              • Пройдут только 2 последние, но ссылки будут неактивные + изначально все проходит через

                function onlytext($text)
                {
                $text = preg_replace ("/[^0-9a-zA-Zа-яА-ЯёЁ \.,!@?%-:;()_+=&\n]/", "", $text);
                $text = str_replace ("'", "", $text);
                return trim($text);
                }
                Ответить
                • В том-то и дело, что эти регэкспы
                  1) не режут всё, что нужно;
                  2) режут что не нужно.

                  Следовательно, они
                  1) бесполезны;
                  2) вредны.
                  Ответить
          • Принцип действия базируется на поиске содержимого после "
            <a" и до "/a>" и замены найденного на "".
            Ответить

    Добавить комментарий