Реклама на сайте Advertise with us

Нужна регулярка для замены URL-а

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:

осинизатор

С нами с 10.03.03
Сообщения: 8491
Рейтинг: 819

Ссылка на сообщениеДобавлено: 18/04/07 в 16:26       Ответить с цитатойцитата 

Нужна регулярка для PHP (через preg_replace(), например), которая бы заменяла в заданном тексте все выражения <a href="*" и <a href='*' на <a href="blablabla*" и <a href='blablabla*' где "*" это URL в любом возможном формате, включая ".,&?".

При этом, было бы неплохо, если бы заменялись только те URL-а, которые не содержат в себе определенной последовательности символов, например "ABC".

Например:
<a href="cnn.com"> превращается в <a href="blablablacnn.com">
<a href="abc.com"> так и остается <a href="abc.com">

ушел на завод

0
 



С нами с 18.01.06
Сообщения: 322
Рейтинг: 487

Ссылка на сообщениеДобавлено: 18/04/07 в 19:43       Ответить с цитатойцитата 

Вот код набросал, проверил, работает, добавить осталось тока чтобы комбинацию букв abc пропускал icon_smile.gif
Код:

$str = file_get_contents('path_to_file');
$search = array('@<a href=[\'"]http://([^>^\'^"]*)[\'"]?>@si');
$replace = array('<a href="http://blablabla\1">');
$str = preg_replace($search, $replace, $str);
echo $str;

3
 

осинизатор

С нами с 10.03.03
Сообщения: 8491
Рейтинг: 819

Ссылка на сообщениеДобавлено: 18/04/07 в 20:47       Ответить с цитатойцитата 

proc3nt писал:
Вот код набросал, проверил, работает, добавить осталось тока чтобы комбинацию букв abc пропускал icon_smile.gif
Код:

$str = file_get_contents('path_to_file');
$search = array('@<a href=[\'"]http://([^>^\'^"]*)[\'"]?>@si');
$replace = array('<a href="http://blablabla\1">');
$str = preg_replace($search, $replace, $str);
echo $str;



Дык, вот в том-то и проблема чтобы добавить...

ушел на завод

0
 



С нами с 26.02.03
Сообщения: 788
Рейтинг: 299

Ссылка на сообщениеДобавлено: 18/04/07 в 21:29       Ответить с цитатойцитата 

Код:
$string="<a href='cnn.com'>CNN</a>";

$string=preg_replace("/(\<a[^>]+?href[^>]*?=[^>]*?['\"]?)((?!.*?abc)[^>'\"]+)(['\"]?[^>]*?>)/is","$1blablabla$2$3",$string);


Ещё вариант, с http://

Код:

$string="<a href='http://cnn.com'>CNN</a>";

echo preg_replace("/(\<a[^>]+?href[^>]*?=[^>]*?['\"]?http:\/\/)((?!.*?abc)[^>'\"]+)(['\"]?[^>]*?>)/is","$1blablabla$2$3",$string);

3
 

осинизатор

С нами с 10.03.03
Сообщения: 8491
Рейтинг: 819

Ссылка на сообщениеДобавлено: 18/04/07 в 22:40       Ответить с цитатойцитата 

Спасибо, а оно для URL-а в любом формате подойдет?

Вообще, эта штука нужна для того, чтобы преобразовывать все URL-ы (<a href>) , не содержащие заданной последовательности символов ("abc") в формат, приемлимый для тред скриптов.

Иными словами, надо добавить "out.php?url=" перед каждой такой ссылкой. При чем, содержимое самой ссылки лучше всего закодировать при помощи base64_encode().

Например:
<a href="http://cnn.com" превращается в <a href="out.php?url=aHR0cDovL2Nubi5jb20="

<a href='http://cnn.com' превращается в <a href='out.php?url=aHR0cDovL2Nubi5jb20='

<a href="http://www.abc.com" превращается в <a href="http://www.abc.com" (т.е. без изменений)

Вот такая хитрая регулярка мне нужна icon_smile.gif

ушел на завод

0
 



С нами с 26.02.03
Сообщения: 788
Рейтинг: 299

Ссылка на сообщениеДобавлено: 19/04/07 в 00:47       Ответить с цитатойцитата 

cyberxxx писал:
Спасибо, а оно для URL-а в любом формате подойдет?

У меня работает даже в самых сложных ситуациях.

Вот то же с кодированием урла. Важно не убирать stripslashes, если у тебя предположительно урлы будут в двойных ковычках.
Код:
$string='<a href="googlegoogle.com?param1=1&param2=2#link">CNN</a>';

$string=preg_replace("/(\<a[^>]+?href[^>]*?=[^>]*?['\"]?)((?!.*?abc)[^>'\"]+)(['\"]?[^>]*?>)/ise","stripslashes('\\1out.php?url='.base64_encode('\\2').'\\3')",$string);


Так же, если все урлы разные (где-то одинарные ковычки, где-то их нет, где-то стиль и target=_blank и т.п.), их можно унифицировать, получив на выходе урлы нужного тебе формата:

Код:
$string='<a href="googlegoogle.com?param1=1&param2=2#link" class="asd" id=12 target=\'_blank\'>CNN</a>';

$string=preg_replace("/(\<a[^>]+?href[^>]*?=[^>]*?['\"]?)((?!.*?abc)[^>'\"]+)(['\"]?[^>]*?>)/ise","stripslashes('<a href=\"out.php?url='.base64_encode('\\2').'\">')",$string);

5
 

осинизатор

С нами с 10.03.03
Сообщения: 8491
Рейтинг: 819

Ссылка на сообщениеДобавлено: 19/04/07 в 01:06       Ответить с цитатойцитата 

Сенькс -- практически то, что надо!

Только вот такой вариант все же работать не будет:
Код:
$string='<a href="abc.com?param1=1&param2=2#link" class="asd" id=12 target=\'_blank\'>CNN</a>';

$string=preg_replace("/(\<a[^>]+?href[^>]*?=[^>]*?['\"]?)((?!.*?abc)[^>'\"]+)(['\"]?[^>]*?>)/ise","stripslashes('<a href=\"out.php?url='.base64_encode('\\2').'\">')",$string);


По идее, должно бы выдаваться:
<a href="abc.com?param1=1&param2=2#link" class="asd" id=12 target=\'_blank\'>CNN</a>

т.к. в URL-е присутствует "abc".

ушел на завод

0
 



С нами с 26.02.03
Сообщения: 788
Рейтинг: 299

Ссылка на сообщениеДобавлено: 19/04/07 в 01:22       Ответить с цитатойцитата 

Ну лучше конечно, чтоб у всех урлов в начале было http:// Если нет - проще так же регуляркой пройтись сначала по базе урлов, поставить http:// там где нет. А дальше:

Код:

$string='<a href="http://abc.com?param1=1&param2=2#link" class="asd" id=12 target=\'_blank\'>CNN</a>';

$string=preg_replace("/(\<a[^>]+?href[^>]*?=[^>]*?['\"]?http:\/\/)((?!.*?abc)[^>'\"]+)(['\"]?[^>]*?>)/ise","stripslashes('<a href=\"out.php?url='.base64_encode('\\2').'\">')",$string);

Это работает.

Либо же можно сделать ещё одну проверку:

Код:

$string='<a href="http://abc.com?param1=1&param2=2#link" class="asd" id=12 target=\'_blank\'>CNN</a>';

if (!stristr("abc",$string))
$string=preg_replace("/(\<a[^>]+?href[^>]*?=[^>]*?['\"]?)(.*[^>'\"]+)(['\"]?[^>]*?>)/ise","stripslashes('<a href=\"out.php?url='.base64_encode('\\2').'\">')",$string);

5
 

осинизатор

С нами с 10.03.03
Сообщения: 8491
Рейтинг: 819

Ссылка на сообщениеДобавлено: 19/04/07 в 01:39       Ответить с цитатойцитата 

Так оно как раз и не работает для URL-ов, где есть "http://" (в моем примере http:// есть у всех URL-ов)

Например, тут у закодированного адреса будет срезано "http://":
Код:
$string='<a href="http://cnn.com?param1=1&param2=2#link" class="asd" id=12 target=\'_blank\'>CNN</a>';

$string=preg_replace("/(\<a[^>]+?href[^>]*?=[^>]*?['\"]?http:\/\/)((?!.*?abc)[^>'\"]+)(['\"]?[^>]*?>)/ise","stripslashes('<a href=\"out.php?url='.base64_encode('\\2').'\">')",$string);


Т.е. на выходе мы получаем:
<a href="out.php?url=Y25uLmNvbT9wYXJhbTE9MSZwYXJhbTI9MiNsaW5r">CNN</a>, а base64_decode("Y25uLmNvbT9wYXJhbTE9MSZwYXJhbTI9MiNsaW5r") выдает "cnn.com?param1=1&param2=2#link" icon_sad.gif

Может быть просто тупо сделать так:
Код:

$string='<a href="http://cnn.com?param1=1&param2=2#link" class="asd" id=12 target=\'_blank\'>CNN</a>';

$string=preg_replace("/(\<a[^>]+?href[^>]*?=[^>]*?['\"]?http:\/\/)((?!.*?abc)[^>'\"]+)(['\"]?[^>]*?>)/ise","stripslashes('<a href=\"out.php?url='.base64_encode('http://\\2').'\">')",$string);


Только "class="asd" id=12 target=\'_blank\'" все равно херится...

Второй же вариант (тот, что с дополнительной проверкой) мне точно не подойдет, т.к. в тексте много разных URL-ов может быть, а проверка по if сработает для всего текста, а не для каждого конкретного линка.

ушел на завод

0
 



С нами с 26.02.03
Сообщения: 788
Рейтинг: 299

Ссылка на сообщениеДобавлено: 19/04/07 в 09:23       Ответить с цитатойцитата 

Так да, то что я привёл в последнем примере - там надо в подстановке ещё http:// подставить, как ты и написал, тогда будет работать, я просто забыл.

А класс, ид и т.п. специально херится, для унификации выходящих урлов. Если не надо херить, то просто вставляешь \\1 вместо <a href=\"out.php?url=, как в самом пером примере, и порядок icon_smile.gif

5
 

осинизатор

С нами с 10.03.03
Сообщения: 8491
Рейтинг: 819

Ссылка на сообщениеДобавлено: 19/04/07 в 20:27       Ответить с цитатойцитата 

Подставил твою регулярку себе в скриптик -- то что надо! Еще раз спасибо!

ушел на завод

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »