Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   PHP. Регулярные выражения и русские символы. (http://forum.oszone.net/showthread.php?t=31377)

Prisoner 14-01-2004 15:47 214987

Пытаюсь отловить в тексте www адрес в виде Получается такая реализация:
Код:

$Body = EReg_Replace("\[url=([[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/])\]([[:alnum:]]+)\[/url\]",
                          "<a href=\"\\1\">\\2</a>", $Body);

Единственное регулярка не отлавливает конструкции если в них "заголовок ссылки" набран русскими буквами. Setlocale не помогла. Есть варианты?

Vlad Drakula 14-01-2004 20:02 214988

Prisoner
Код:

<?php
// коды для вставки картинок
$Codes["img"] = array(
    // esc [[img]], [[/img]], [[img=*]] => [img], [/img], [img=*]
  "#\[\[(/?)img\]\]#is" => "[$1img]",
  "#\[\[img=(\S+?)\]\]#is" =>"[img=$2]",

  // Безопасность: убираем потенциальные ссылки на скрипты (\s* - защита от IE)
  "#\[img=.*?s\s*c\s*r\s*i\s*p\s*t\s*:.*?\]#is" =>
    "[img=<font class=\"warning\">«предупреждение: скрипты в постах запрещены»</font>]",

  "#\[img\].*?s\s*c\s*r\s*i\s*p\s*t\s*:.*?\[/img\]#is" =>
    "[img]<font class=\"warning\">«предупреждение: скрипты в постах запрещены»</font>[/img]",

  // Безопасность: убираем картинки, ссылающиеся на e-mail (назойливая штука)
  "#\[img=[^]]*?mailto:[^]]*?\]#is" =>
    "[img=<font class=\"warning\">«предупреждение !»</font>]",

    "#\[img\][^]]*?mailto:[^]]*?\[/img\]#is" =>
    "[img]<font class=\"warning\">«предупреждение !»</font>[/img]",

    "#\[img=(\S+?)\]\s*(?!.*?\[(?:img).*?)(.+?)\s*\[/img\]#is" =>
    "<img src=\"$1\" alt=\"$2\" title=\"$2\" />",

    "#\[img]\s*(?!.*?\[(?:img).*?)(.+?)\s*\[/img\]#is" =>
    "<img src=\"$1\" alt=\"$1\" title=\"\" />",

    "#\[img=(\S+?)\]#is" =>
    "<img src=\"$1\" alt=\"$1\" />",
);

// простые коды
$Codes["easy"] = array(
  // esc кодов с непосредственным html-эквивалентом
   "#\[\[(/?)(b|i|u|s|strike|small|center|pre|tt|sub|sup)\]\]#is"  => "[$1$2]",
  "#\[\[(br|hr)\]\]\n?#i" => "&#91$1&#93",

  // Коды с непосредственным html-эквивалентом
   "#\[(b|i|u|s|strike|small|center|pre|tt|sub|sup)\](.+?)\[/\\1\]#is" => "<$1>$2</$1>",
  "#\[br\]\n?#i" => "<br />",
  "#\[hr\]\n?#i" => "<hr width=\"40%\" align=\"left\" />",

  // (c) (r) and (tm)
  "#\(c\)#i"  => "©",
  "#\(tm\)#i" => "™",
  "#\(r\)#i"  => "®",
);

// коды цитирования
$Codes["quote"] = array(
  // esc [q] [quote]
  "#\[\[(/?)(q|quote)\]\]#is" => "[$1$2]",
  "#\[\[(q|quote)=(\S+?)\]\]#is" =>"[$1=$2]",

  // [quote] без автора
  "#\[(q|quote)\](.*?)\[/\\1]#is" => "<blockquote class=\"title\">Цитата:</blockquote><blockquote class=\"body\">$2</blockquote>",

    //

       
Цитата:

       
       
               
       
       

                       

                       
                               

                                        Цитата автор
                                       
                               

                               
текст

                       
                       

               

 "#\[(q|quote)=(.*?)\](.*?)\[/\\1]#is" => "<blockquote class=\"title\">Цитата ([user=$2]):</blockquote><blockquote class=\"body\">$3</blockquote>",
);

// коды ссылок
$Codes["url"] = array(
  // esc [url] [MAIL]
  "#\[\[(/?)(url|mail)\]\]#is" => "[$1$2]",
  "#\[\[(url|mail)=(\S+?)\]\]#is" =>"[$1=$2]",

  // Безопасность: убираем потенциальные ссылки на скрипты (\s* - защита от IE)
  "#\[(?:url|mail)=.*?s\s*c\s*r\s*i\s*p\s*t\s*:.*?\]#is" =>
  "<font class=\"warning\">«предупреждение: скрипты в постах запрещены»</font>",

  "#\[(url|mail)\].*?s\s*c\s*r\s*i\s*p\s*t\s*:.*?\[/\\1\]#is" =>
  "<font class=\"warning\">«предупреждение: скрипты в постах запрещены»</font>",

    // [url]


    "#\[url]\s*?(?!.*?\[(?:url).*?)(.*?)\s*?\[/url\]#is" =>
    "<a href=\"$1\">$1</a>",

    "#\[url=(\S*?)\]\s*?(?!.*?\[(?:url).*?)(.*?)\s*?\[/url\]#is" =>
    "<a href=\"$1\">$2</a>",

    "#\[url=(\S*?)\]#is" =>
    "<a href=\"$1\">$1</a>",

    // [MAIL]
    "#\[mail]\s*?(?!.*?\[(?:mail).*?)(.*?)\s*?\[/mail\]#is" =>
    "<a href=\"mailto:$1\">$1</a>",

    "#\[mail=(\S*?)\]\s*?(?!.*?\[(?:mail).*?)(.*?)\s*?\[/mail\]#is" =>
    "<a href=\"mailto:$1\">$2</a>",

    "#\[mail=(\S*?)\]#is" =>
    "<a href=\"mailto:$1\">$1</a>",
);

// коды для работы с текстом
$Codes["font"] = array(
  // esc Кодов свойств шрифта [font] (face), [size], [color], [right]:
  "#\[\[(font|size|color)=(.+?)\]\]#is" => "[$1=$2]",
    "#\[\[/(font|size|color|right)\]\]#i" => "[/$1]",
  "#\[\[right\]\]#i"                    => "[right]",

  // Коды свойств шрифта [font] (face), [size], [color], [right]:
  "#\[font=(.+?)\](.+?)\[/font\]#is"         => "<font face=\"$1\">$2</font>",
  "#\[(size|color)=(\S+?)\](.+?)\[/\\1\]#is" => "<font $1=\"$2\">$3</font>",
  "#\[right\](.+?)\[/right\]#is"             => "<font align=\"right\">$1</font>",
);

// коды info
$Codes["info"] = array(
  //esc info tags
  "#\[\[info:version\]\]#is"       => "[info:version]",
  "#\[\[info:author\]\]#is"        => "[info:author]",
  "#\[\[info:random\]\]#is"        => "[info:random]",
  "#\[\[info:random=(\d+?)\]\]#is" => "[info:random=$1]",

  //info tags
  "#\[info:version\]#is"           => "VParser 1.0.1",
  "#\[info:author\]#is"            => "Vladislav Mokeev[Vlad]",
  "#\[info:random\]#ise"           => "rand(0,100)",
  "#\[info:random=(\d+?)\]#ise"    => "rand(0,$1)",
);

// коды оффтопика
$Codes["off"] = array(
    // esc codes
  "#\[\[(/?)off\]\]#is"  => "[$1off]",

  // [off] - оффтопик
  "#\[off\]\s*(.+?)\s*\[/off\]#is" => "<font class=\"offtopic\">оффтопик: $1</font>",
  "#/\*\s*(.+?)\s*\*/#is"         => "<font class=\"offtopic\">оффтопик: $1</font>",
);

//расширенные коды
$Codes["added"] = array(
    // esc codes
    "#\[\[(user|def|acr|added)=(.+?)\]\]#is" => "[$1=$2]",
    "#\[\[/(def|acr|added)\]\]#i"            => "[/$1&#93",
  "#\[\[(added|time|date)\]\]#i"           => "[$1]",

  // Тег [user] - прямая ссылка на юзера
  "#\[user=(.+?)\]#is" => "<a class=\"profile\" href=\"./profile.php?name=$1\">$1</a>",

    // VParser 1.0.1: Теги [def] и [acr] - определение (всплывающая подсказка) для слова
  "#\[def=(.+?)\]\s*(.+?)\s*\[/def\]#is" => "<a class=\"definition\" title=\"$1\">$2</a>",
  "#\[acr=(.+?)\]\s*(.+?)\s*\[/acr\]#is" => "<acronym title=\"$1\">$2</acronym>",


    // VParser 1.0.1:
  "#\[added\](.+?)\[/added\]#is" => "<font class=\"added-title\">Добавлено:</font><br>$1",
  "#\[added=(.+?)\](.+?)\[/added\]#is" => "<font class=\"added-title\">Добавлено ($1):</font><br>$2",
  "#\[time\]#ie" => "'<span class=\"date\">'. date('G:i:s'). '</span>'",
  "#\[date\]#ie" => "'<span class=\"time\">'. date('d.m.Y'). '</span>'",
);

// коды для вырезания не пропарсенных тегов
$Codes["delete"] = array(
  // Удаление лишних (известных) тегов
  "#\[/?(?:font|size|off|b|i|u|s|color|url|link|mail|img|image|center|right|pre|list|user|acr|def|info|time|date|debug|added).*?\]#is" => "",
);
?>

вот такие рег експы.
а вот так из надо применять:
Код:

         foreach($Codes["url"] as $rule => $value)
            while ( preg_match( $rule, $raw ) )
              $raw = preg_replace($rule, $value, $raw, -1);

надеюсь снял все вопросы по данной теме?

PS
рег експы проверенный и вроде все баги пофиксены, и дыры тоже.

если что найдешь, то обязятельно напиши!

Prisoner 15-01-2004 06:56 214989

Vlad Drakula, да, выглядит забавно, более того - красиво. Надеюсь тебя не сильно озадачит просьба выслать кусок кода мылом, дабы не мучиться мыслью, что форум что-ть не так отобразил?  Я покопаюсь еще...

Prisoner 16-01-2004 14:31 214990

Все гуд! Спасибо :)  на счет глюков пообщаеемся...


Время: 05:25.

Время: 05:25.
© OSzone.net 2001-