Войти

Показать полную графическую версию : PHP. Регулярные выражения и русские символы.


Prisoner
14-01-2004, 15:47
Пытаюсь отловить в тексте www адрес в виде заголовок ссылки (http://...)
Получается такая реализация:

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


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

Vlad Drakula
14-01-2004, 20:02
Prisoner

<?php
// коды для вставки картинок
$Codes["img"] = array(
   // esc [], [], [] => [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]
 "#\[\[(/?)(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>",

   // [quote=автор]текст
 "#\[(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
Vlad Drakula, да, выглядит забавно, более того - красиво. Надеюсь тебя не сильно озадачит просьба выслать кусок кода мылом, дабы не мучиться мыслью, что форум что-ть не так отобразил?  Я покопаюсь еще...

Prisoner
16-01-2004, 14:31
Все гуд! Спасибо :)  на счет глюков пообщаеемся...




© OSzone.net 2001-2012