осинизатор
С нами с 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">
|
|
|
|
С нами с 18.01.06
Сообщения: 322
Рейтинг: 487
|
Добавлено: 18/04/07 в 19:43 |
Вот код набросал, проверил, работает, добавить осталось тока чтобы комбинацию букв 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;
|
|
|
|
|
осинизатор
С нами с 10.03.03
Сообщения: 8491
Рейтинг: 819
|
Добавлено: 18/04/07 в 20:47 |
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;
|
|
Дык, вот в том-то и проблема чтобы добавить...
|
|
|
|
С нами с 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);
|
|
|
|
|
осинизатор
С нами с 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" (т.е. без изменений)
Вот такая хитрая регулярка мне нужна
|
|
|
|
С нами с 26.02.03
Сообщения: 788
Рейтинг: 299
|
Добавлено: 19/04/07 в 00:47 |
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);
|
|
|
|
|
осинизатор
С нами с 10.03.03
Сообщения: 8491
Рейтинг: 819
|
Добавлено: 19/04/07 в 01:06 |
Сенькс -- практически то, что надо!
Только вот такой вариант все же работать не будет:
Код: | $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".
|
|
|
|
С нами с 26.02.03
Сообщения: 788
Рейтинг: 299
|
Добавлено: 19/04/07 в 01:22 |
Ну лучше конечно, чтоб у всех урлов в начале было 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);
|
|
|
|
|
осинизатор
С нами с 10.03.03
Сообщения: 8491
Рейтинг: 819
|
Добавлено: 19/04/07 в 01:39 |
Так оно как раз и не работает для 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 сработает для всего текста, а не для каждого конкретного линка.
|
|
|
|
С нами с 26.02.03
Сообщения: 788
Рейтинг: 299
|
Добавлено: 19/04/07 в 09:23 |
Так да, то что я привёл в последнем примере - там надо в подстановке ещё http:// подставить, как ты и написал, тогда будет работать, я просто забыл.
А класс, ид и т.п. специально херится, для унификации выходящих урлов. Если не надо херить, то просто вставляешь \\1 вместо <a href=\"out.php?url=, как в самом пером примере, и порядок
|
|
|
|
осинизатор
С нами с 10.03.03
Сообщения: 8491
Рейтинг: 819
|
Добавлено: 19/04/07 в 20:27 |
Подставил твою регулярку себе в скриптик -- то что надо! Еще раз спасибо!
|
|
|
|