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

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

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

 

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

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

тема: Найти текстовые адреса сайтов и преобразовать в гиперссылки
 
 автор: Владимир22   (23.09.2008 в 14:17)   письмо автору
 
 

Нужно найти в тексте фрагменты, типа www.site.ru и преобразовать их в гиперссылки (<a href ="http://site.ru">www.site.ru</a>). Кто уже сталкивался, пожалуйста, помогите.

  Ответить  
 
 автор: xx77   (24.09.2008 в 00:19)   письмо автору
 
   для: Владимир22   (23.09.2008 в 14:17)
 

<?
$txt 
'список, неполный :
доп. комманда инициализации соединения 
AT+CGDCONT=1,"IP","internet.beeline.ru"
индексный файл Perl index.pl
конструкция javascript: obj.id = "id"  
Запрос SQL SELECT base.table.id, base.table2.pr FROM ...
e-mail xxxxxxx@xxxxxxxx.xx
реальный адрес
 ftp://anonymous:xxxxx%40mail.ru@ftp.ru:21/pub/
с http:// бывают похожие c именами и пасврдами
и портами и с русскими буквами , и  с запятыми, всевозможными скобками в путях  и прочими символами
http://ru.wikipedia.org:80/wiki/Продукт
нереальный адрес типа реального  127.0.0.1:8080/sklad/
'
;
?>


Вам какие хочется адреса выделить , с гет параметрами или только домены, с http:// или без него и начинающиеся с начала слова , или обязательно ограниченные пробельными символами ,
и допускаются-ли символы национальных алфавитов, т.к. браузеры их сами урл.кодируют?
И устроит-ли то в ссылки будут преобразовываться не только адреса ?

  Ответить  
 
 автор: Владимир22   (24.09.2008 в 12:38)   письмо автору
 
   для: xx77   (24.09.2008 в 00:19)
 

Это нужно НЕ для парсера страниц - всё гораздо проще:
Пользователь в форме пишет объявление с текстом и если в нём есть ссылка, типа www.site.ru , то нужно автоматически сделать её гиперссылкой.
Т.е. логика такова:
найти www.
и потом начиная с найденного и до первого пробела, захватить это и сделать гиперссылку. Как?

  Ответить  
 
 автор: vitali   (24.09.2008 в 14:36)   письмо автору
 
   для: Владимир22   (24.09.2008 в 12:38)
 

Вы уверены, что для всех ссылок из посланья пользователя ключевым словом будет www. Заблуждаетесь. Внимательно прочтите предыдущий вопрос, Вам адресованный.

  Ответить  
 
 автор: xx77   (24.09.2008 в 15:06)   письмо автору
 
   для: Владимир22   (24.09.2008 в 12:38)
 

логика не выдерживает критики , как говорится)
при такой логике любой из пользователей сможет отправлять всех
ваших посетителей по одному только движению их мышей бороздить безкрайние просторы интернета ))

,пусть даже нужно опираться только на обязательное www в начале ссылки
попробуйте например такие несколько шаблонов
<style type="text/css">
a { font: Bold 120% Arial;  }
 </style>
<pre><?
$txt 
'
www.mail.ru
http://www.mail.ru
или просто сказать
www.Адреса или www.......
wwwww.wwwwwwwwwwww
dom.www.site.xx
--------------------------
mail.ru
www4.mail.ru
www.mail.ru/"onclick="alert(\'badWord\');return(false);
www.ГЫ-ГЫ
 '
;

$pattern = array(
    
'#\b(www\.\S+)#',
    
'#(?<=^|\s)(www\.\S+)#',
    
'#\b(?:http://)?(www\.\S+)#',
    
'#\b(?:http://)?(www\.[^"\s]+)#',
    
'~
    (?:https?://)?(www\.
        (?:[0-9a-z][0-9a-z\-]{1,24}\.){1,6}
        (?:biz|com|edu|gov|int|info|mil|moby|net|org
        |[a-z]{2})(?:/[\.,;/\?\[\]%=&0-9a-zа-ЯёЁ]*)?)
        # здесь много ещё не перечислил, никаких @:портов ....
        ~ix'
,
    
'#(www\.\S+)#'
);

foreach(
$pattern AS $one) {

echo 
preg_replace($one'<a href="http://\1">\1</a>'$txt )
 . 
'<hr/>';
}
?> 

опираться на отсутствие пробелов в адресе , сами видите что получается
,тем более это всё вводится пользователями
правильно использовать то что было перед www , http:// или https://
или ещё какой протокол конечно можно
, но как быть если адрес содержит www в середине и не содержит в начале

тот большой шаблон должен быть раза в три больше , что-бы учесть все существующие виды адресов ,
что создаст ещё и затраты времени .
и всё-равно несуществование несуществующих не факт если они пройдут все возможные проверки формата записи

Но попробуйте , может у Вас получится безошибочно определить являются-ли слова с точками адресами

  Ответить  
 
 автор: Владимир22   (24.09.2008 в 17:53)   письмо автору
 
   для: xx77   (24.09.2008 в 15:06)
 

Спасибо, xx77!
Но мне нужно максимально просто - только проверить на www.. В инструкции при заполнении формы всем пользователям предписывается вставлять сайты именно так: www.site.ru. Поэтому нужно всё максимально упростить.
Вот сделал так(взял кусок из вашего кода):
$text=preg_replace('#(www\.\S+)#', '<a href="http://\1">\1</a>', $text);  

Выводит вроде всё нормально, типа www.site.ru.
Но в конце ставит точку!!!!
<a href="http://www.site.ru.">http://www.site.ru.</a>
В итоге сайт не открывается.
Как от неё(точки) избавиться?

  Ответить  
 
 автор: AcidTrash   (25.09.2008 в 21:42)   письмо автору
 
   для: Владимир22   (24.09.2008 в 17:53)
 

Возможно так, как понятно из вашего поста.
$text=preg_replace('#(www\.\S+[^\.])#', '<a href="http://\1">\1</a>', $text);   

  Ответить  
 
 автор: Владимир22   (25.09.2008 в 23:20)   письмо автору
 
   для: AcidTrash   (25.09.2008 в 21:42)
 

Спасибо, AcidTrash! Так вроде работает, но есть одна проблема:
Если после ссылки вплотную идёт любой символ (точка, запятая и пр. - например: www.site.ru,), то всё это захватывается и идёт в гиперссылку. Может в курсе, как сделать в этом коде принудительный пробел сразу после названия сайта, чтобы любые другие символы, идущие вплотную не захватывались в адрес. Заранее спасибо!

  Ответить  
 
 автор: AcidTrash(кафе)   (30.09.2008 в 13:14)
 
   для: Владимир22   (25.09.2008 в 23:20)
 

$text=preg_replace('#(www\.\S+\b)#s', '<a href="http://\1">\1</a>', $text);  

  Ответить  
 
 автор: Владимир22   (25.09.2008 в 23:21)   письмо автору
 
   для: AcidTrash   (25.09.2008 в 21:42)
 

Ещё актуально. Нelp!

  Ответить  
 
 автор: EXP   (26.09.2008 в 01:20)   письмо автору
 
   для: Владимир22   (25.09.2008 в 23:21)
 

Возможно вас заинтересует синтаксис Регулярных выражений
например здесь http://softtime.ru/group/id_group=3 ?

Это я не потому говорю что задача какая-то из ряда вон выходящая, а потому что Вы не только не смогли обьяснить что Вам нужно но и сами не знаете что Вам нужно.
Ну ск5азали что из формы вводят эти www............... ,
ну пусть даже это будет INPUT, и запросто можно ещё опираться на то что www............... это и есть вся строка ,
и можно применять ^ и $,
но теперь осазалось что Вам нужно не просто любые непробельные символы после www.
И какие именно адреса ,или их форматы, вам нужны, Вы тоже не знаете, вот, и что Вам можно ответить?
preg_replace('/^www\.\S+[^\.,!"$&#\(*,:=_0-9]$/' , '<u>\0</u>', trim($text));

?

[поправлено модератором]

  Ответить  
 
 автор: Владимир22   (26.09.2008 в 12:56)   письмо автору
 
   для: EXP   (26.09.2008 в 01:20)
 

EXP, Ваш код не работает (просто ничего не происходит, никаких замен).

$text="Это текст в котором могут встречаться названия сайтов, например www.site.ru или после названий могут быть какие-либо знаки, типа точки и пр. - примеры: www.site.ru, www.site.ru; www.site.ru- www.site.ru! www.site.ru? www.site.ru* www.site.ru. Надо, чтобы все названия сайтов были преобразованы в гиперссылки.";
$text=preg_replace('/^www\.\S+[^\.,!"$&#\(*,:=_0-9]$/' , '<u>\0</u>', trim($text)); 
echo  $text;

Ничего не работает!

  Ответить  
 
 автор: Keda   (01.10.2008 в 17:08)   письмо автору
 
   для: Владимир22   (24.09.2008 в 17:53)
 

Если ориентироваться только на www и сделать простенько, то выражение будет таким
/www\.([aA-zZ0-9][aA-zZ0-9-]*\.)+[aA-zZ]{2,6}/

  Ответить  
 
 автор: AcidTrash   (01.10.2008 в 22:33)   письмо автору
 
   для: Keda   (01.10.2008 в 17:08)
 

И что это за народное плавание?
Смотрим по теме от автор: Владимир22 (25.09.2008 в 23:20) .

  Ответить  
 
 автор: Keda   (02.10.2008 в 10:29)   письмо автору
 
   для: AcidTrash   (01.10.2008 в 22:33)
 

А в чем собственно проблема? Точка в конце не захватывается. По теме верно.
Если есть какие-либо возражения, прошу высказаться по существу, а не абстрактными намеками.

  Ответить  
 
 автор: AcidTrash   (02.10.2008 в 13:12)   письмо автору
 
   для: Keda   (02.10.2008 в 10:29)
 

>А в чем собственно проблема? Точка в конце не захватывается. По теме верно.
У вас выражение вообще не правильно составлено. Не только точка или запятая в конце не захватывается, но еще и половина адреса.
Вот пример текста в котором надо заменить www.internet.beeline.ru. на ссылку.
С вашим РГ это будет выглядеть как-то так:
<?
$txt 
'список, неполный :
доп. комманда инициализации соединения
AT+CGDCONT=1,"IP","www.internet.beeline.ru."
индексный файл Perl index.pl
'
;
print 
preg_replace("/www\.([aA-zZ0-9][aA-zZ0-9-]*\.)+[aA-zZ]{2,6}/"'<a href="http://\\1">\\1</a>'$txt);
?>

Ну и как отлично все работает?
Думаю, что нет!
Тем более по тому как написал автор, следует, что ему проверять
на корректность не надо(лишь бы только было www), но это его проблемы.

Бог с ним сделаем с проверкой, тогда это выражение будет выглядеть как-то так:
preg_replace("/(www\.[aA-zZ0-9\.]+[aA-zZ]{2,6})/", '<a href="http://\\1">\\1</a>', $txt);

Но! Если адрес будет типа www.site.ru/?b=8, то в гиперссылку пол адреса не попадет

Так что вариант предложенный мной автор: AcidTrash(кафе)(30.09.2008 в 13:14), думаю более подходит.

  Ответить  
 
 автор: Keda   (02.10.2008 в 14:47)   письмо автору
 
   для: AcidTrash   (02.10.2008 в 13:12)
 

Выражение составлено верно. Необходимо его правильно использовать. Строка замены должна быть
'<a href="http://\\0">\\0</a>'
На выходе будем иметь текст

список, неполный :
доп. комманда инициализации соединения
AT+CGDCONT=1,"IP","<a href="http://www.internet.beeline.ru">www.internet.beeline.ru</a>."
индексный файл Perl index.pl

Насчет полного адреса. Задача стояла распознавать только домен, с чем прекрасно справляется мое выражение. Мало того, оно соответствует RFC 1034, в котором сказано, что домен состоит только из букв латинского алфавита, цифр, точки и знака минус. Домен должен начинаться с буквы или цифры и не должен содержать две точки подряд. Единственное, что не учитывается - это максимальная длинна адреса.

  Ответить  
 
 автор: AcidTrash(кафе)   (02.10.2008 в 15:38)
 
   для: Keda   (02.10.2008 в 14:47)
 

>'<a href="http://\\0">\\0</a>'
Да, это меня, что-то заклинило.
Ладно, насчет вида адреса, это известно только автору.

  Ответить  
Rambler's Top100
вверх

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