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

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

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

 

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

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

тема: Как перевести адрес в ссылку
 
 автор: Елена Смирнова   (07.05.2008 в 23:13)   письмо автору
 
 

Как перевести адрес типа sub.domen.ru или http://sub.domen.ru в ссылку? Приэтом домен может быть не тока третьего но и второго и пятого уровня

   
 
 автор: sil   (07.05.2008 в 23:24)   письмо автору
 
   для: Елена Смирнова   (07.05.2008 в 23:13)
 

:)

неочен понятно в какую ссылку перевести
можетбыть имеется ввиду такое
<?php
$domen 
'sub.domen.ru';
echo 
$ssylka '<a href="http://' $domen '">' $domen '</a><br/>' "\n";
?>

?

/
забыл добавить проверку if (substr($domen, 0, 7) == 'http://') $domen = 'http://' . $domen;

   
 
 автор: Atheist   (07.05.2008 в 23:34)   письмо автору
 
   для: Елена Смирнова   (07.05.2008 в 23:13)
 

<?php
function _make_link($s)
{
    if( 
strpos(strtolower($s), 'http:') !== )
    {
        
$s 'http://' $s;
    }

    return 
'<a href="' $s '">' $s '</a>';
}

$s 'Как перевести адрес типа sub.domen.ru или http://sub.domen.ru в ссылку?';
$domain 'domen.ru';
$s preg_replace('/(http:\\/\\/)?([a-z_0-9-]+\\.)*' preg_quote($domain) . '(:\\d+)?(\\/[a-z0-9_.\\/#%;&?]*)?/ei''_make_link("\\0")'$s);

echo 
$s;
?>


P.S. Если Вы хотели любые "адреса" вида sub.example.com, а не конкретного домена, то я считаю это неправильным и показывать не буду.
P.P.S. На мой паттерн замены URL особо не надейтесь.

   
 
 автор: Елена Смирнова   (08.05.2008 в 01:04)   письмо автору
 
   для: Atheist   (07.05.2008 в 23:34)
 

Может кому понадобится.
Сделала так:


<?
$text 
eregi_replace("((http://))((([a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z;]{2,3}))|(([0-9]{1,3}\.){3}([0-9]{1,3})))((/|\?)[a-z0-9~#%&'_\+=:;\?\.-]*)*)""<a href=\"\\1\\3\">\\1\\3</a>"$text);
?>

   
 
 автор: AcidTrash   (08.05.2008 в 12:40)   письмо автору
 
   для: Елена Смирнова   (08.05.2008 в 01:04)
 

<?php
$text
="текст www.yandex.ru/r.php?gh=6 текст2 http://rambler.ru текст3 http://www.yahoo.ru текст4";
$result=preg_replace("#((http://)?(www)?[a-z\d._-]+\.[a-z]{1,6}/?([a-z\d\?=&\._-]*))#is""<a href=\"\\1\">\\1</a>",$text);
print 
$result;
?>

   
 
 автор: Незнайка   (08.05.2008 в 13:11)   письмо автору
 
   для: Елена Смирнова   (07.05.2008 в 23:13)
 

Возможно Вас заинтересует

<?php ## "Активизация" HTML-ссылок.
$text 'Ссылка:(http://domain.com,) http://test.test.test.test.test.ru, www.test.test.test.test.test.ru, www.ru?"a"=b, http://site.net. http://www.softtime.ru/forum/read.php?id_forum=6&id_theme=53188';
echo 
hrefActivate($text);

// Функция обратного вызова для preg_replace_callback().
function hrefCallback($p) {
  
// Преобразуем спецсимволы в HTML-представление.
  
$name htmlspecialchars($p[0]);
  
// Если нет протокола, добавляем его в начало строки.  
  
$href = !empty($p[1])? $name "http://$name";
  
// Формируем ссылку.
  
return "<a href=\"$href\">$name</a>";
}

// Заменяет ссылки на их HTML-эквиваленты ("подчеркивает ссылки").
function hrefActivate($text) {
  return 
preg_replace_callback(
    
'{
      (?:
        (\w+://)          # протокол с двумя слэшами
        |                 # - или -
        www\.             # просто начинается на www
      )
      [\w-]+(\.[\w-]+)*   # имя хоста
      (?: : \d+)?         # порт (не обязателен)
      [^<>"\'()\[\]\s]*   # URI (но БЕЗ кавычек и скобок)
      (?:                 # последний символ должен быть...
          (?<! [[:punct:]] )  # НЕ пунктуацией
        | (?<= [-/&+*]     )  # но допустимо окончание на -/&+*
      )
    }xis'
,
    
"hrefCallback",
    
$text
  
);
}   
?>


P.S. Правда на: sub.domen.ru (без www, http://) cрабатывать не будет и на ftp.domain.ru то же

   
 
 автор: sil   (08.05.2008 в 20:46)   письмо автору
 
   для: Незнайка   (08.05.2008 в 13:11)
 

здесь бывали похожие темы


похоже сложнее найти адрес чем заменить.
сравнительный анализ приведённых выражений :)
<pre><?
$ptrn
[] = "#((http://)?(www)?[a-z\d._-]+\.[a-z]{1,6}/?([a-z\d\?=&\._-]*))#is";

$ptrn[] = '{
      (?:
        (\w+://)          # протокол с двумя слэшами
        |                 # - или -
        www\.             # просто начинается на www
      )
      [\w-]+(\.[\w-]+)*   # имя хоста
      (?: : \d+)?         # порт (не обязателен)
      [^<>"\'()\[\]\s]*   # URI (но БЕЗ кавычек и скобок)
      (?:                 # последний символ должен быть...
          (?<! [[:punct:]] )  # НЕ пунктуацией
        | (?<= [-/&+*]     )  # но допустимо окончание на -/&+*
      )
    }xis'
;

$ptrn[] = '№\b(?:(https?|ftp|udp)://)?(?:([a-z1-9][a-z0-9\-]{1,14}\.){1,7}?\b(com|edu|biz|gov|int|info|mil|net|org|moby|[a-z]{2})|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b(:\d{2,4})?(?:/[A-Za-z0-9/\?\.\-_%&=]*)?№'// и такое,  навороченное и наверное долгоищущее )

$txt 'Ссылка: 1(http://domain.com,) 2 http://test.test.test.test.test.ru, 3 www.test.test.test.test.test.ru, www.ru?"a"=b, 4 http://site.net. 5 http://www.softtime.ru/forum/read.php?id_forum=6&id_theme=53188
текст 6 www.yandex.ru/r.php?gh=6 текст2 7 http://rambler.ru текст3 8 http://www.yahoo.ru текст4
Как перевести адрес типа 9 sub.domen.ru или 10 http://sub.domen.ru в ссылку?

и немного того.что ещё бывает:
11 http://77.222.42.122/forum/
12 https://www.icq.com/register/
13 ftp://ftp.ru:21/
14 ftp://anonymous:anonim%40mail.ru@ftp.ru/pub/

и немного того что бывает но не ссылки
[.htaccess]
Options +ExecCGI
DirectoryIndex index.pl
[/.htaccess]
http://что.то такое
puppy-4.00-k2.6.21.7-seamonkey.iso
j2sdk-1_4_2_17-windows-i586-p.exe
vjredist.exe
'
;

for (
$i=0$i<count($ptrn); $i++)
{

 
preg_match_all($ptrn[$i], $txt$out);
 
print_r($out[0]);
print 
"\n\n";
}
?></pre>

в случае с таким текстом победило второе, но http://что.то тоже пропустило ;)

   
 
 автор: Незнайка   (09.05.2008 в 13:48)   письмо автору
 
   для: sil   (08.05.2008 в 20:46)
 

>> похоже сложнее найти адрес чем заменить.
Это точно...

>>но http://что.то тоже пропустило
Тут я не совсем, все понял. Имеете ввиду какой, еще скрипт пропускает?

   
 
 автор: sil   (09.05.2008 в 14:40)   письмо автору
 
   для: Незнайка   (09.05.2008 в 13:48)
 

это я о том что символьный класс \w
пропускает как латинские буквы с _ \d так и всевозможные немецкие с умляутами , русские и ещё какие.то похожие на испанские :)
которых немножко есть в таблице кодировки cp1251 и много в utf-8 .
Хотя возможно скоро и будут урл'ы на всех языках.
Что-то более точное есть в POSIX символьных классах , типа [[:alpha:]]+ [:alnum:] но по возможности лучше обходить слишком придирчивое и ресурсоёмкое

   
 
 автор: Незнайка   (11.05.2008 в 18:06)   письмо автору
 
   для: sil   (09.05.2008 в 14:40)
 

Понятно.
>> по возможности лучше обходить слишком придирчивое и ресурсоёмкое
Спасибо, буду иметь ввиду : )

   
Rambler's Top100
вверх

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