Master-X
Регистрация
|
Вход
Форум
|
Новости
|
Статьи
Главная
»
Форум
»
Программинг, Скрипты, Софт, Сервисы
»
Тема:
Нужна регулярка для замены URL-а
Новая тема
Ответить
цитата
18/04/07 в 16:26
cyberxxx
Нужна регулярка для 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">
цитата
18/04/07 в 19:43
proc3nt
Вот код набросал, проверил, работает, добавить осталось тока чтобы комбинацию букв abc пропускал
Код:
$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;
цитата
18/04/07 в 20:47
cyberxxx
proc3nt писал:
Вот код набросал, проверил, работает, добавить осталось тока чтобы комбинацию букв abc пропускал
Код:
$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;
Дык, вот в том-то и проблема чтобы добавить...
цитата
18/04/07 в 21:29
cookie
Код:
$string="<a href='cnn.com'>CNN</a>";
$string=preg_replace("/(\<a[^>]+?href[^>]*?=[^>]*?['\"]?)((?!.*?
abc
)[^>'\"]+)(['\"]?[^>]*?>)/is","$1
blablabla
$2$3",$string);
Ещё вариант, с http://
Код:
$string="<a href='http://cnn.com'>CNN</a>";
echo preg_replace("/(\<a[^>]+?href[^>]*?=[^>]*?['\"]?http:\/\/)((?!.*?
abc
)[^>'\"]+)(['\"]?[^>]*?>)/is","$1
blablabla
$2$3",$string);
цитата
18/04/07 в 22:40
cyberxxx
Спасибо, а оно для 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" (т.е. без изменений)
Вот такая хитрая регулярка мне нужна
цитата
19/04/07 в 00:47
cookie
cyberxxx писал:
Спасибо, а оно для URL-а в любом формате подойдет?
У меня работает даже в самых сложных ситуациях.
Вот то же с кодированием урла. Важно не убирать stripslashes, если у тебя предположительно урлы будут в двойных ковычках.
Код:
$string='<a href="googlegoogle.com?param1=1¶m2=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¶m2=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);
цитата
19/04/07 в 01:06
cyberxxx
Сенькс -- практически то, что надо!
Только вот такой вариант все же работать не будет:
Код:
$string='<a href="abc.com?param1=1¶m2=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¶m2=2#link" class="asd" id=12 target=\'_blank\'>CNN</a>
т.к. в URL-е присутствует "abc".
цитата
19/04/07 в 01:22
cookie
Ну лучше конечно, чтоб у всех урлов в начале было http:// Если нет - проще так же регуляркой пройтись сначала по базе урлов, поставить http:// там где нет. А дальше:
Код:
$string='<a href="http://abc.com?param1=1¶m2=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¶m2=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);
цитата
19/04/07 в 01:39
cyberxxx
Так оно как раз и не работает для URL-ов, где есть "http://" (в моем примере http:// есть у всех URL-ов)
Например, тут у закодированного адреса будет срезано "http://":
Код:
$string='<a href="http://cnn.com?param1=1¶m2=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¶m2=2#link"
Может быть просто тупо сделать так:
Код:
$string='<a href="http://cnn.com?param1=1¶m2=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
сработает для всего текста, а не для каждого конкретного линка.
цитата
19/04/07 в 09:23
cookie
Так да, то что я привёл в последнем примере - там надо в подстановке ещё http:// подставить, как ты и написал, тогда будет работать, я просто забыл.
А класс, ид и т.п. специально херится, для унификации выходящих урлов. Если не надо херить, то просто вставляешь
\\1
вместо
<a href=\"out.php?url=
, как в самом пером примере, и порядок
цитата
19/04/07 в 20:27
cyberxxx
Подставил твою регулярку себе в скриптик -- то что надо! Еще раз спасибо!
Новая тема
Ответить
Эта страница в полной версии