На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ALXR
  
    > Регулярные выражения , замена элементов текста
      Делаю форум. Возникла необходимость выделения ссылок в тексте при помощи соответствующих тегов.
      Например, мне нужно заменить
      ExpandedWrap disabled
         
        ..............
        Вот, кстати сайт на эту тему: <a class='tag-url' href='http://www.abrakadabra.ru/' target='_blank'>http://www.abrakadabra.ru/</a>
        ..............


      на
      ExpandedWrap disabled
         
        ..............
        Вот, кстати сайт на эту тему: <a href="http://www.abrakadabra.ru/" target="_blank">http://www.abrakadabra.ru/</a>
        ..............


      Можно ли решить данную задачу при помощи использования рег. выражений?
      Как работать с регулярными выражениями? Заранее спасибо за линки на мануали по PHP, но мне этого не надо. Я хочу понять, как работают такие функции как preg_replace, ereg_replace и др.

      Также я прекрасно понимаю, что можно создать свой алгоритм, но будет ли это актуальным, если имеется возможность использования вышеописанных функций?

      Всем заранее спасибо! 8)
        Извините, Ваш форум немного видоизменил первый отрывок кода.
        В оригинале тегов и .. там не было. Так что, прошу иметь ввиду. :)
          Еще раз извиняюсь перед модераторами данного форума. Во втором моем сообщений опять Ваш форум заменил оригинальный текст.

          Приведу еще раз, только вставляя в теги пробелы:
          Цитата

          В оригинале тегов [ u r l = ... ] и [ / u r l ] там не было. Так что, прошу иметь
            Цитата
            WinOpen, 29.02.04, 22:24
            Я хочу понять, как работают такие функции как preg_replace, ereg_replace и др.

            вам шашечки, или ехать.
            как работают эти функции - это рассказывать алгоритм поиска и замены одних фрагментов другими.
            что делают - это рассказывать, что на входе фукнции, и что на выходе.
            preg_replace - задаешь что менятm, на что? и строку, в которой надо менять.
            ExpandedWrap disabled
               
              $res=preg_replace("|<a class='tag-url' href='http://(*.)' target='_blank'>(*.)</a>|U","<a href=\\1>\\2</a>",$str);


            а обьяснение, что есть регулярные выражения - читай в любой книжке по перлу или пхп
            Сообщение отредактировано: Demo_S -
              Скрипт не работает. Причины ниже:

              WinOpen,
              на форуме Invision Power Board, как в многих других, любое выражение, начинающееся с http:// автоматически определяется как ссылка, и вставляются теги [ url] и [ /url].

              Вижу, Demo_S'у тоже не удалось представить код в правильном виде (WinOpen, Demo_S на самом деле ответил верно, вот только форум опять переработал приведенный код). Для того, чтобы лишне не утруждать уважаемого Demo_S, выкладываю тот же код вне форума, на своем сайте, тем самым избегая случая, который может повлечь за собой трансформирмацию скриптом данного форума оригинального исходного кода ответа:

              http://pub3.nm.ru/pub/html/1.htm (спасибо Jin_X'у за FTP общего пользования ;) )
              Сообщение отредактировано: Mastilior -
                Ну что-то вроде:
                ExpandedWrap disabled
                  sub specialChars
                  {
                      my@p=@_;
                      map s/([^\wабвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ])/'&#'.ord($1).';'/geo,@p;
                      +(wantarray?@p:$p[0])
                  }
                   
                  sub urlEncode
                  {
                      my@p=@_;
                      map s/(.)/sprintf('%%%02X',ord$1)/geo,@p;
                      +(wantarray?@p:$p[0])
                  }
                   
                  %SINONIM=(
                      'url'=>sub{
                          my$attr=shift||return;
                          my$value=shift;
                   
                          my%att=(('url'.$attr)=~/(\w*)=(\S+)/go);
                   
                          if($att{url}=~/^(http|ftp|smtp|pop3|https|ftps|mailto)\:(\/\/|)(.+)$/io&&
                              (
                                  (lc($1) ne 'mailto'&&length($2)==2)||
                                  (lc($1) eq 'mailto'&&!$2)
                              ))
                          {
                              return '<a href="'.&urlEncode($att{url}).'">'.&specialChars($value||$att{url}).'</a>';
                          }
                          else
                          {
                              return '[url'.$attr.']'.$value.'[/url]';
                          }
                      }
                  );
                   
                  sub translit
                  {
                      my$tag=lc(shift)||return;
                      my$attr=shift;
                      my$value=shift;
                   
                      return &{$SINONIM{$tag}}($attr,$value) if exists$SINONIM{$tag};
                      return '['.$tag.$attr.']'.$value.'[/'.$tag.']';
                  }
                   
                  sub AUTOLOAD
                  {
                      print join', ',caller;
                  }
                   
                  print "Content-type: text/html; charset=windows-1251\n\n";
                   
                  open F,'<text.txt';
                   #flock F,4;
                      while(<F>)
                      {
                        s/\[(\w+)([^\[\]]*)\]([^\[\]]*)\[\/\1\]/&translit($1,$2,$3)/gieo;
                        print;
                      }
                   #flock F,8;
                  close F;


                %SINONIM сам доработай
                  а что такое "%SINONIM"? Это функция или что? Как она работает?
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0264 ]   [ 15 queries used ]   [ Generated: 27.04.24, 12:18 GMT ]