[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Применение функции к параметру preg_replace
aledain
Добрый день. Нужна небольшая помощь.

Есть обработчик бб-кодов:


$content=preg_replace('(\[(URL|url)\=((http|ftp|https):\/\/[a-zA-Z0-9\/\-\+\?\&\.\=\_\~\#\'\%\;]*)\](.+?)\[\/(URL|url)\])', '<a rel="nofollow" href="http://www.site.net/index.php?page=away&to=$2">$4</a>', $content);

А нужно чтобы работало вот такое:

$content=preg_replace('(\[(URL|url)\=((http|ftp|https):\/\/[a-zA-Z0-9\/\-\+\?\&\.\=\_\~\#\'\%\;]*)\](.+?)\[\/(URL|url)\])', '<a rel="nofollow" href="http://www.site.net/index.php?page=away&to='.urlencode($2).'">$4</a>', $content);

У меня это не работает, т.к. $2 применяю за рамками preg_replace.

Как это сделать? Т.е. применить функцию к $2



Спустя 6 минут, 4 секунды (15.10.2010 - 09:48) DedMorozzz написал(а):
Не внятно написано, что желаемо получить, без длительного разбирательства. И по сему:
если применить ф-ю на вхождение, то так: urlencode(.'$2'.)

Спустя 9 минут (15.10.2010 - 09:57) aledain написал(а):
href="http://www.site.net/index.php?page=away&to=$2"


$2 - это ссылка
требуется вместо самого $2 подставить urlencode от неё. или применить по желанию другую функцию.

Спустя 12 минут, 40 секунд (15.10.2010 - 10:09) aledain написал(а):
Попробовал так

$content=preg_replace('(\[(URL|url)\=((http|ftp|https):\/\/[a-zA-Z0-9\/\-\+\?\&\.\=\_\~\#\'\%\;]*)\](.+?)\[\/(URL|url)\])', '<a rel="nofollow" href="http://www.site.net/index.php?page=away&to='.urlencode(.'$2'.).'">$4</a>', $content);

не сработало

Спустя 5 минут, 43 секунды (15.10.2010 - 10:15) arvitaly написал(а):
echo preg_replace("~.*(t1).*$~U",'aaa' . urlencode('$1') . 'ccc',"aaat1bbb");


работает, значит проблема в другом

Спустя 6 минут, 12 секунд (15.10.2010 - 10:21) aledain написал(а):
Попробовал так

$content=preg_replace('(\[(URL|url)\=((http|ftp|https):\/\/[a-zA-Z0-9\/\-\+\?\&\.\=\_\~\#\'\%\;]*)\](.+?)\[\/(URL|url)\])', '<a rel="nofollow" href="http://www.site.net/index.php?page=away&to='.urlencode('$2').'">$4</a>', $content);

Сейчас ошибку не выдаёт, но замену не производит
Пишет вместо ссылки само $2

Спустя 6 минут, 7 секунд (15.10.2010 - 10:27) arvitaly написал(а):
Покажите исходную строку

Спустя 9 минут, 31 секунда (15.10.2010 - 10:37) aledain написал(а):
И так ещё раз попытаюсь более понятно объяснить.


$content=preg_replace('(\[(URL|url)\=((http|ftp|https):\/\/[a-zA-Z0-9\/\-\+\?\&\.\=\_\~\#\'\%\;]*)\](.+?)\[\/(URL|url)\])', '<a rel="nofollow" href="http://www.site/index.php?page=away&to=$2">$4</a>', $content);


Исходная строка
яндекс


Как вставить код бб=кодов здесь?

Она заменяется на
<a rel="nofollow" href="http://www.site.net/index.php?page=away&to=http://ya.ru">яндекс</a>


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

Но требуется к вхождению $2 (ссылка http://ya.ru) применить функцию urlencode
Это-то как раз и не работает, т.к я не знаю как правильно применять функции к вхождениям.

А уже принимающий скрипт сделает urldecode

Спустя 2 минуты, 37 секунд (15.10.2010 - 10:40) twin написал(а):
preg_replace_callback()
Вот тут посмотри, мож чего полезного найдешь.

Спустя 6 минут, 27 секунд (15.10.2010 - 10:46) arvitaly написал(а):
Да нужно callback, ваш вариант не будет работать так как urlencode выполняется перед выполнение preg_replace

Спустя 5 минут, 29 секунд (15.10.2010 - 10:51) aledain написал(а):
Значит решается всё не так просто как я рассчитывал.

К сожалению я регулярные выражения совершенно не знаю, да и пхп тоже довольно слабо.

Может ли кто-нибудь помочь?

Вот код который нужно исправить:

// external uris
// text

$content=preg_replace('(\[(URL|url)\=((http|ftp|https):\/\/[a-zA-Z0-9\/\-\+\?\&\.\=\_\~\#\'\%\;]*)\](.+?)\[\/(URL|url)\])', '<a rel="nofollow" href="http://www.site.net/index.php?page=away&to=$2">$4</a>', $content);
// For people too lazy to put http:// on the uri. /Shouldn't/ be XSSable
$content=preg_replace('(\[(URL|url)\=([a-zA-Z0-9\/\-\+\?\&\.\=\_\~\#\'\%\;]*)\](.+?)\[\/(URL|url)\])', '<a rel="nofollow" href="http://www.site.net/index.php?page=away&to=http://$2">$3</a>', $content);
// uri
$content=preg_replace('(\[url\]((http|ftp|https):\/\/([a-zA-Z0-9\/\-\+\?\&\.\=\_\~\#\'\%\;]*))\[\/url\])','<a rel="nofollow" href="http://www.site.net/index.php?page=away&to=$2://$3">$2://$3</a>',$content);
// lazy http:// people...
$content=preg_replace('(\[url\]([a-zA-Z0-9\/\-\+\?\&\.\=\_\~\#\'\%\;]*)\[\/url\])','<a rel="nofollow" href="http://www.site.net/index.php?page=away&to=http://$1">http://$1</a>',$content);
////////////////

Спустя 51 минута, 25 секунд (15.10.2010 - 11:43) twin написал(а):
Я дал ссылку, куда еще подробнее...
Разве что в раздел - предлагаю работу

Спустя 8 минут, 1 секунда (15.10.2010 - 11:51) aledain написал(а):
И на а этом спасибо. Действительно помогло.

Спустя 14 минут, 50 секунд (15.10.2010 - 12:06) aledain написал(а):
Вместо

$content=preg_replace('(\[(URL|url)\=((http|ftp|https):\/\/[a-zA-Z0-9\/\-\+\?\&\.\=\_\~\#\'\%\;]*)\](.+?)\[\/(URL|url)\])', '<a rel="nofollow" href="http://www.site.net/index.php?page=away&to=$2">$4</a>', $content);

сделал

function extredir($match)
{
return '<a rel="nofollow" href="http://www.site.net/index.php?page=away&to='.urlencode($match[2]).'">'.$match[4].'</a>';
}
$content=preg_replace_callback('(\[(URL|url)\=((http|ftp|https):\/\/[a-zA-Z0-9\/\-\+\?\&\.\=\_\~\#\'\%\;]*)\](.+?)\[\/(URL|url)\])', 'extredir', $content);


Но при этом получаю "Внутренняя ошибка сайта."
Подскажите где косяк?

Спустя 8 минут, 23 секунды (15.10.2010 - 12:14) arvitaly написал(а):
Это несвязанные вещи

Спустя 1 минута, 16 секунд (15.10.2010 - 12:15) aledain написал(а):
Всё разобрался. Сорри.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.