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

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

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

 

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

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

тема: Замена ссылок
 
 автор: tAleks   (09.02.2012 в 15:55)   письмо автору
 
 

В тексте есть ссылки четырех типов:

http://site.ru/index.php - c префиксом http://
http://www.site.ru/index.php - c префиксом http://www.
www.site.ru/index.php - c префиксом www
http://localhost/index.php - на локальный сайт

Нужно их сделать в такие:


<?
$server 
'mysite.ru';

http://site.ru/index.php -> <a href="http://site.ru/index.php">http://site.ru/index.php</a>

http://www.site.ru/index.php -> <a href="http://www.site.ru/index.php">http://www.site.ru/index.php</a>

www.site.ru/index.php -> <a href="http://www.site.ru/index.php">www.site.ru/index.php</a>

http://localhost/index.php -> <a href="http://'.$server.'/index.php">http://'.$server.'/index.php</a>



Помогите составить регулярное выражение.

P.S.: Порылся в поиске, нашел решение, но с функцией обратного вызова. А мне нужно без функции обратного вызова.

  Ответить  
 
 автор: Sfinks   (09.02.2012 в 16:25)   письмо автору
 
   для: tAleks   (09.02.2012 в 15:55)
 

1. Кирилица допустима?
2. После index.php GET параметры типа ?a=1&b=2 возможны?

  Ответить  
 
 автор: tAleks   (09.02.2012 в 16:44)   письмо автору
 
   для: Sfinks   (09.02.2012 в 16:25)
 

>1. Кирилица допустима?

Да

>2. После index.php GET параметры типа ?a=1&b=2 возможны?

Да, после домена может быть все что угодно.

  Ответить  
 
 автор: Sfinks   (09.02.2012 в 16:46)   письмо автору
 
   для: tAleks   (09.02.2012 в 16:44)
 

Раз все возможно, тогда так:
$pattern = "#(?:http://)?((www\.)?([а-яёa-z\d][а-яёa-z\d\-]*\.)+[а-яёa-z]{2,6}(/([а-яё\w\-\.]*[а-яё\w\-/]{1})*(\?(([a-z][\w\-]*)?(=(%[a-z\d]{2}|[\w\-\.\+])*)?)?(&(amp;)?(([a-z][\w\-]*)?(=(%[a-z\d]{2}|[\w\-\.\+])*)?)?)*)?)?)#ui";

=))))
Надеюсь доступ по 2222му порту и с логином и паролем не надо? =)))

  Ответить  
 
 автор: Sfinks   (09.02.2012 в 16:44)   письмо автору
 
   для: tAleks   (09.02.2012 в 15:55)
 

Надо убегать, поэтому пока так:
<pre><?php
  $s 
"http://site.ru/index.php
http://www.site.ru/index.php
www.site.ru/index.php"
;

  
$pattern "#(?:http://)?((www\.)?([a-z\d][a-z\d\-]*\.)+[a-z]{2,6}(/([\w\-\.]*[\w\-/]{1})*)?)#ui";
  
$s preg_replace($pattern,"<a href=\"http://$1\">$0</a>",$s);
  echo 
$s;
?>
</pre>
Это для первых 3ех вариантов.

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

  Ответить  
 
 автор: tAleks   (09.02.2012 в 17:21)   письмо автору
 
   для: Sfinks   (09.02.2012 в 16:44)
 

Спасибо!

Укоротил до такого:


$pattern = "#(http://)?((www\.)?(\S)+/(\S)+)#i";



P.S.: В меру своего понимания. Если ошибаюсь, поправьте.

  Ответить  
 
 автор: Sfinks   (09.02.2012 в 19:26)   письмо автору
 
   для: tAleks   (09.02.2012 в 17:21)
 

Ну если ссылки вида http://*&7?/%%#3$@;:'" вас устроят, тогда все правильно. Зачем тогда описывать задачу было так сложно. Так и написали бы, мол мне нужно из какой-нибудь фигни сделать ссылку =)

  Ответить  
 
 автор: Sfinks   (09.02.2012 в 19:46)   письмо автору
 
   для: tAleks   (09.02.2012 в 17:21)
 

Кстати, вы пробовали свое РВ на реальном тексте? Вот так после обработки выглядит ваш первый пост:
В тексте есть ссылки четырех типов:

 <a href="http://http://">http://site.ru/index.php</a> - c префиксом <a href="http://">http://</a>
 <a href="http://http://">http://www.site.ru/index.php</a> - c префиксом <a href="http://">http://www.</a>
 <a href="http://">www.site.ru/index.php</a> - c префиксом www
 <a href="http://http://">http://localhost/index.php</a> - на локальный сайт

Кстати, проверив, оказалось что и мое тоже надо дополнять. Чтоб работало так как вы просили в 1ом и 3ем постах и при этом выбирало только корректные ссылки, должно быть так:
 $pattern = "#(?:http://|(?=www\.))((www\.)?([а-яёa-z\d][а-яёa-z\d\-]*\.)+[а-яёa-z]{2,6}(/([а-яё\w\-\.]*[а-яё\w\-/]{1})*(\?(([a-z][\w\-]*)?(=(%[a-z\d]{2}|[\w\-\.\+])*)?)?(&(amp;)?(([a-z][\w\-]*)?(=(%[a-z\d]{2}|[\w\-\.\+])*)?)?)*)?)?)#ui";
тогда результат такой:
В тексте есть ссылки четырех типов:

 <a href="http://site.ru/index.php">http://site.ru/index.php</a> - c префиксом http://
 <a href="http://www.site.ru/index.php">http://www.site.ru/index.php</a> - c префиксом http://www.
 <a href="http://www.site.ru/index.php">www.site.ru/index.php</a> - c префиксом www
 http://localhost/index.php - на локальный сайт

  Ответить  
 
 автор: tAleks   (09.02.2012 в 20:33)   письмо автору
 
   для: Sfinks   (09.02.2012 в 19:46)
 

Спасибо!

Если не трудно, посните вот это:
(?:http://|(?=www\.))


Порылся в справочнике, и в книжке, которая у меня есть, нигде не могу найти описание этих конструкций ?: и ?=.

Если есть ссылка на русскоязычный манула по этому делу, тоже буду благодарен.

  Ответить  
 
 автор: Sfinks   (09.02.2012 в 21:28)   письмо автору
 
   для: tAleks   (09.02.2012 в 20:33)
 

(?:шаблон) - это тоже самое, что и просто (), но не создается обратная связь.
(?=шаблон) - значит что сразу после этой точки будет находиться шаблон
В данном случае конструкцию (?:http://|(?=www\.)) можно прочитать так: Либо есть "http://", либо сразу за этим следует "www\.".

Я вот этим пользуюсь: Регулярные выражения в Perl. Там не все подходит для PHP, но большая часть подходит. Полного описания RegExp заточенного под ПХП я не встречал.

  Ответить  
 
 автор: tAleks   (13.02.2012 в 16:29)   письмо автору
 
   для: Sfinks   (09.02.2012 в 21:28)
 

Спасибо!

  Ответить  
 
 автор: tAleks   (09.02.2012 в 17:25)   письмо автору
 
   для: Sfinks   (09.02.2012 в 16:44)
 

Забыл еще два возможных варианта. :)

Может быть еще так: http://site.ru
и так: www.site.ru

И тоже надо сделать в активные ссылки.

  Ответить  
 
 автор: Sfinks   (09.02.2012 в 19:29)   письмо автору
 
   для: tAleks   (09.02.2012 в 17:25)
 

вобще в моем варианте оба этих возможности есть.

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

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