|
|
|
| В тексте есть ссылки четырех типов:
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.: Порылся в поиске, нашел решение, но с функцией обратного вызова. А мне нужно без функции обратного вызова. | |
|
|
|
|
|
|
|
для: tAleks
(09.02.2012 в 15:55)
| | 1. Кирилица допустима?
2. После index.php GET параметры типа ?a=1&b=2 возможны? | |
|
|
|
|
|
|
|
для: Sfinks
(09.02.2012 в 16:25)
| | >1. Кирилица допустима?
Да
>2. После index.php GET параметры типа ?a=1&b=2 возможны?
Да, после домена может быть все что угодно. | |
|
|
|
|
|
|
|
для: 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му порту и с логином и паролем не надо? =))) | |
|
|
|
|
|
|
|
для: 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 нужно отдельно заменять, вторым прогоном, т.к. там шаблон замены совсем другой. | |
|
|
|
|
|
|
|
для: Sfinks
(09.02.2012 в 16:44)
| | Спасибо!
Укоротил до такого:
$pattern = "#(http://)?((www\.)?(\S)+/(\S)+)#i";
|
P.S.: В меру своего понимания. Если ошибаюсь, поправьте. | |
|
|
|
|
|
|
|
для: tAleks
(09.02.2012 в 17:21)
| | Ну если ссылки вида http://*&7?/%%#3$@;:'" вас устроят, тогда все правильно. Зачем тогда описывать задачу было так сложно. Так и написали бы, мол мне нужно из какой-нибудь фигни сделать ссылку =) | |
|
|
|
|
|
|
|
для: 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 - на локальный сайт
|
| |
|
|
|
|
|
|
|
для: Sfinks
(09.02.2012 в 19:46)
| | Спасибо!
Если не трудно, посните вот это:
Порылся в справочнике, и в книжке, которая у меня есть, нигде не могу найти описание этих конструкций ?: и ?=.
Если есть ссылка на русскоязычный манула по этому делу, тоже буду благодарен. | |
|
|
|
|
|
|
|
для: tAleks
(09.02.2012 в 20:33)
| | (?:шаблон) - это тоже самое, что и просто (), но не создается обратная связь.
(?=шаблон) - значит что сразу после этой точки будет находиться шаблон
В данном случае конструкцию (?:http://|(?=www\.)) можно прочитать так: Либо есть "http://", либо сразу за этим следует "www\.".
Я вот этим пользуюсь: Регулярные выражения в Perl. Там не все подходит для PHP, но большая часть подходит. Полного описания RegExp заточенного под ПХП я не встречал. | |
|
|
|
|
|
|
|
для: Sfinks
(09.02.2012 в 21:28)
| | Спасибо! | |
|
|
|
|
|
|
|
для: Sfinks
(09.02.2012 в 16:44)
| | Забыл еще два возможных варианта. :)
Может быть еще так: http://site.ru
и так: www.site.ru
И тоже надо сделать в активные ссылки. | |
|
|
|
|
|
|
|
для: tAleks
(09.02.2012 в 17:25)
| | вобще в моем варианте оба этих возможности есть. | |
|
|
|