Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Замена [url] на html ссылку
 
 автор: PantiL   (16.05.2006 в 09:27)   письмо автору
 
 

В книге Самоучитель PHP 5 на странице 387
имеется следующий код


$str = ereg_replace("(.*)\\[url\\](.*)\\[/url](.*)", "\\1<a href=\\2>\\2</a>\\3", $str);

Он прекрасно работает, если в тексте имеется только одна ссылка, а если же их несколько то заменяется только последняя. :(

<?
//Текст в переменной $str намеренно искажен(вставлен пробел в [url ]), так как форум меняет его на ссылки.
//А этого наверное не надо делать в тегах code
$str "[url ]http://softtime.ru[/url] [url ]http://softtime.ru[/url]";
$str ereg_replace("(.*)\\[url\\](.*)\\[/url](.*)""\\1<a href=\\2>\\2</a>\\3"$str);
echo 
$str;
?>



А как же тогда произвести замену всех ссылок?

   
 
 автор: himic   (16.05.2006 в 10:19)   письмо автору
 
   для: PantiL   (16.05.2006 в 09:27)
 

А на тебе мою функцию вывода

function zamena($post){
//$post=wordwrap($post,50,' ',1);
$post = preg_replace_callback("|([a-zа-я\d!]{35,})|i","split_text",$post);
$text = "[сode]";
$lastocc = 0;
$sndocc = 1;
$result = "";
while($sndocc)
{
$fstocc = strpos($post,"[сode]",$lastocc);
$sndocc = strpos($post,"[/сode]",$fstocc);
if(($fstocc>0 && $sndocc>0 && $lastocc>0) || ($fstocc >= 0 && $sndocc>0 && $lastocc == 0))
{
$result .= nl2br(htmlspecialchars(substr($post,$lastocc,$fstocc - $lastocc)));
$result .= "<table border=0 ><tr><td class=codeblock>".highlight_string(substr($post,$fstocc + 6,$sndocc - $fstocc - 6),true)."</td></tr></table>";
$lastocc = $sndocc + 7;
}
else
{
$result .= nl2br(htmlspecialchars(substr($post,$lastocc,strlen($post)-$lastocc)));
break;
}
}
$post = $result;

$post = preg_replace("#\[url[\s]*=[\s]*([\S]+)[\s]*\](.*?)\[/url\]#isU",'<a href="\\1">\\2</a>',$post);
$post = preg_replace( "#\[zag\](.+?)\[/zag\]#is", "<span class=\"grayDk\">\\1</span>", $post );
$post = preg_replace( "#\[email\](\S+?)\[/email\]#i", "<a href='mailto:\\1' class=\"style1\">\\1</a>", $post );
$post = preg_replace( "#\[email\s*=\s*\&quot\;([\.\w\-]+\@[\.\w\-]+\.[\.\w\-]+)\s*\&quot\;\s*\](.*?)\[\/email\]#i", "<a href='mailto:\\1' class=style1>\\2</a>", $post );
$post = preg_replace( "#\[email\s*=\s*([\.\w\-]+\@[\.\w\-]+\.[\w\-]+)\s*\](.*?)\[\/email\]#i", "<a href='mailto:\\1' class=style1>\\2</a>", $post );
$post = preg_replace("#\[quote\]\s*(.*?)\s*\[/quote\]#is"," <table width=80% border=0 cellpadding=0 cellspacing=1 bgcolor=#666666 style='padding: 5px; margin: 10px'><tr> <td class=date>$1</td></tr></table>",$post);
$post = preg_replace('#\[img(.*?)\](.+?)\[/img\]#','<img src="$2" $1>',$post);
$post = preg_replace( "#\[b\](.+?)\[/b\]#is", "<b>\\1</b>", $post );
$post = preg_replace( "#\[i\](.+?)\[/i\]#is", "<i>\\1</i>", $post );
$post = preg_replace( "#\[u\](.+?)\[/u\]#is", "<u>\\1</u>", $post );
$post = preg_replace( "#\[li\](.+?)\[/li\]#is", "<li>\\1</li>", $post );
$post = preg_replace("#\[table(.*?)\](.*?)\[\/table\]#is","<table$1 border=\"0\" cellpadding=\"2\" cellspacing=\"1\" bgcolor=\"#ffffff\" class=\"style1\"><tbody>$2</tbody></table>",$post);
$post = preg_replace( "#\[tr(.*?)\](.+?)\[/tr\]#is", "<tr$1>$2</tr>", $post );
$post = preg_replace( "#\[td(.*?)\](.+?)\[/td\]#is", "<td bgcolor=#8a8a8a $1>$2</td>", $post );
$post = preg_replace( "#\[div(.*?)\](.+?)\[/div\]#is", "<div $1>$2</div>", $post );
$post = preg_replace("#\[a\s*=\s*(\S+?)\s*\](.*?)\[\/a\]#i","<a name=$1>$2</a>",$post);
$post = preg_replace("(\&nbsp;)"," ",$post);

return $post;
}

   
 
 автор: cheops   (16.05.2006 в 12:33)   письмо автору
 
   для: PantiL   (16.05.2006 в 09:27)
 

Можно воспользоваться следующим регулярным выражением
<?php
    $postbody 
preg_replace("#\[url\][\s]*([\S]*)[\s]*\[\/url\]#si",'<a href="\\1" target=_blank>\\1</a>',$postbody);
?>

   
 
 автор: PantiL   (16.05.2006 в 17:08)   письмо автору
 
   для: cheops   (16.05.2006 в 12:33)
 

Спасибо!!! С этим разобрался.
Теперь вот не получается с вот таким тегом [ url=http://softtime.ru]Сайт[/url]
Если подряд ввести две ссылки то скрипт рассматривает как одну ссылку начиная с первого [url=] и заканчива последним [/url]. Если же между ссылками что-то находится то получается :(

   
 
 автор: PantiL   (16.05.2006 в 18:27)   письмо автору
 
   для: PantiL   (16.05.2006 в 17:08)
 

Всем спасибо ! Задачу решил :)

   
 
 автор: cheops   (17.05.2006 в 13:09)   письмо автору
 
   для: PantiL   (16.05.2006 в 17:08)
 

Приведу решение для тех, кто будет читать эту тему позже
<?php
    $postbody 
preg_replace("#\[url[\s]*=[\s]*([\S]+)[\s]*\][\s]*([^\[]*)\[/url\]#isU",
                             
'<a href="\\1" target=_blank>\\2</a>',
                             
$postbody);
?>

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования