Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Тег а в url и email


Автор: mkredaktor 24.3.2008, 21:35
Помогите плиз. Есть функция которая переносит текст статьи из сайта на форум, и в итоге все ссылки вида <a href=http> и <a href=mailto> заменяются на [url], а нужно что бы емейлы делались через [email]. Помогите плиз дописать код, что бы правильно работало. 
Вот текущий кусок кода:
Код

        $search = array(
                        "/\[a.+?(href=\"?http){1}/i",
                    "/\[a.+?(href=\"?mailto:){1}/i",
                        "/\[a.+?(href=\"?){1}/i",                 
                        "/\[\/a\]/i");

            $replace = array(
                             "[url=http",
                     "[email=",
                             "[url=".$mosConfig_live_site."/",
                             "[/url]");
      
        $message = preg_replace($search, $replace, $message);   


Заменить "/\[a.+?(href=\"?mailto:){1}/i", на нужный ббкод получилось, а вот как сделать что бы различать где нужен закрывающий тег [/url] или [/email], не знаю.



M
MoLeX
Модератор:  пользуемся конструкцией [cоde=php][/cоde]

Автор: mishaSL 26.3.2008, 11:47
mkredaktor, приведи исходный кусок кода HTML и то что должно получиться.

Автор: Smith 26.3.2008, 12:37
Код

$str = preg_replace("/<a href=\"mailto:(.*)\">(.*)</a>/i", "[email=//1]//2[/email]", $str);
$str = preg_replace("/<a href=\"(.*)\">(.*)</a>/i", "[url=//1]//2[/url]", $str);

Автор: mkredaktor 28.3.2008, 13:41
Цитата(Smith @ 26.3.2008,  12:37)
Код

$str = preg_replace("/<a href=\"mailto:(.*)\">(.*)</a>/i", "[email=//1]//2[/email]", $str);
$str = preg_replace("/<a href=\"(.*)\">(.*)</a>/i", "[url=//1]//2[/url]", $str);

Не работает. Вроде все правильно написано, но пишет ошибку
Unknown modifier 'a'

Автор: flashaa 28.3.2008, 14:19
Код

$str = preg_replace("#<a href=\"mailto:(.*)\">(.*)</a>#i", "[email=//1]//2[/email]", $str);
$str = preg_replace("#<a href=\"(.*)\">(.*)</a>#i", "[url=//1]//2[/url]", $str);

Автор: mkredaktor 28.3.2008, 14:35
Цитата(mkredaktor @ 28.3.2008,  13:41)
Цитата(Smith @ 26.3.2008,  12:37)
Код

$str = preg_replace("/<a href=\"mailto:(.*)\">(.*)</a>/i", "[email=//1]//2[/email]", $str);
$str = preg_replace("/<a href=\"(.*)\">(.*)</a>/i", "[url=//1]//2[/url]", $str);

Не работает. Вроде все правильно написано, но пишет ошибку
Unknown modifier 'a'

Кстати добавил \/a

И код стал без ошибок, но все равно не работает :(

Добавлено через 1 минуту и 4 секунды
Цитата(flashaa @ 28.3.2008,  14:19)
Код

$str = preg_replace("#<a href=\"mailto:(.*)\">(.*)</a>#i", "[email=//1]//2[/email]", $str);
$str = preg_replace("#<a href=\"(.*)\">(.*)</a>#i", "[url=//1]//2[/url]", $str);

Сейчас проверю

Автор: mkredaktor 28.3.2008, 14:53
Ээ. Вот что оно заменило в итоге
[email=//1]//2[/email]

Автор: flashaa 28.3.2008, 15:13
Мда, у Smitha в регулярке как минимум 3 ошибки было.. Вот исправленное целиком:
Код

$str = preg_replace('#<a href="mailto:(.*?)">(.*?)</a>#i', '[email=$1]$2[/email]', $str);
$str = preg_replace('#<a href="(.*?)">(.*?)</a>#i', '[url=$1]$2[/url]', $str);

Этот код будем заменять, только правильные атрибуты href, значения которых были в кавычках, причем именно в двойных. Если надо большего, пиши.

Автор: mkredaktor 28.3.2008, 15:53
Вот какой код хтмл я пытаюсь заменить. Может так станет нагляднее.
Код

<a href="mailto:[email protected]">[email protected]</a>
<a title="О портале" target="_blank" href="content/view/7/34/">О портале</a>
<a title="Почитать" target="_blank" href="http://zdorovja.com.ua/content/view/7/35/">Почитать</a>


И нужно получить уже код для форума SMF в таком виде:
Код

[[email protected]][email protected][/email]
[url=http://zdorovja.com.ua/content/view/7/34/]О портале[/url]
[url=http://zdorovja.com.ua/content/view/7/35/]Почитать[/url]


Вот эта переменная содержит коренной путь к сайту $mosConfig_live_site = http://zdorovja.com.ua/
Тоесть должно быть три комбинации:
Две с адресом с $mosConfig_live_site и без и одна комбинация замены мыла.

flashaa, Вот теперь что получилось:
[[email protected]

И после єтого пусто. Тоесть видно все что после ємейле, чего то все обрезало.

Автор: ksnk 28.3.2008, 17:05
Код

$str = preg_replace('~<a[^>]*href=(["\'])mailto:([^\\1]*)\\1[^>]*>(.*?)</a>~i', '[email=$2]$3[/email]', $str);
$str = preg_replace('~<a[^>]*href=(["\'])([^\\1]*)\\1[^>]*>(.*?)</a>~i', '[url=$2]$3[/url]', $str);

Автор: mkredaktor 28.3.2008, 19:35
Цитата(ksnk @ 28.3.2008,  17:05)
Код

$str = preg_replace('~<a[^>]*href=(["\'])mailto:([^\\1]*)\\1[^>]*>(.*?)</a>~i', '[email=$2]$3[/email]', $str);
$str = preg_replace('~<a[^>]*href=(["\'])([^\\1]*)\\1[^>]*>(.*?)</a>~i', '[url=$2]$3[/url]', $str);

Тоже самое. 
В итоге выводит текст и после [[email protected]
пусто и ничего нет. По каким то причинам он его дальше обрубает. 

Автор: ksnk 28.3.2008, 20:41
вот это
Код

$str='<a href="mailto:[email protected]">[email protected]</a>
<a title="О портале" target="_blank" href="content/view/7/34/">О портале</a>
<a title="Почитать" target="_blank" href="http://zdorovja.com.ua/content/view/7/35/">Почитать</a>';
$str = preg_replace('~<a[^>]*href=(["\'])mailto:([^\\1]*?)\\1[^>]*>(.*?)</a>~is', '[email=$2]$3[/email]', $str);
$str = preg_replace('~<a[^>]*href=(["\'])([^\\1]*?)\\1[^>]*>(.*?)</a>~is', '[url=$2]$3[/url]', $str);
echo $str ;

у меня выдает 
Код

[[email protected]][email protected][/email] [url=content/view/7/34/]О портале[/url] [url=http://zdorovja.com.ua/content/view/7/35/]Почитать[/url]

Автор: flashaa 28.3.2008, 20:49
А у меня вот этот код

Код

<?php
$str = '<a href="mailto:[email protected]">[email protected]</a>';

$str = preg_replace('#<a href="mailto:(.*?)">(.*?)</a>#i', '[email=$1]$2[/email]', $str);
//$str = preg_replace('#<a href="(.*?)">(.*?)</a>#i', '[url=$1]$2[/url]', $str);

echo $str;
?>

Выводит вот что: 
Код

[[email protected]][email protected][/email]

Автор: ksnk 28.3.2008, 20:57
Не заметил косяк... http://forum.vingrad.ru/forum/topic-202402/anchor-entry1459243/0.html#

flashaa, в условии встречаются еще и такие данные 
Код

...<a title="О портале" target="_blank" href= ...

Автор: flashaa 28.3.2008, 21:04
ksnk, я не спорю. Я лишь подтвердил что автор не прав.

Автор: mkredaktor 28.3.2008, 22:12
Спасибо работает. А подскажите плиз как теперь к этому всему прикрутить мою переменную $mosConfig_live_site.

Ну адрес может передаваться как и с корневым путем и без:
Код

<a title="О портале" target="_blank" href="content/view/7/34/">О портале</a>
<a title="Почитать" target="_blank" href="http://zdorovja.com.ua/content/view/7/35/">Почитать</a>';


Как видно в первом варианте нет корневого пути и нужно тогда при замене его добавить,
а во втором случае не нужно добавлять.
В итоге должно получиться: 
Код

[url=http://zdorovja.com.ua/content/view/7/34/]О портале[/url]
[url=http://zdorovja.com.ua/content/view/7/35/]Почитать[/url]


А сейчас выводит так:
Код

[url=content/view/7/34/]О портале[/url]


Тоесть отсутствует вот эта переменная
Код

$mosConfig_live_site = http://zdorovja.com.ua

Автор: mkredaktor 29.3.2008, 13:56
Поможете, добрые люди?

Автор: mkredaktor 31.3.2008, 15:09
Поможете мне переделать предыдущий код с переменной $mosConfig_live_site ?

Автор: ksnk 31.3.2008, 15:47
Код

$str = preg_replace('~<a[^>]*href=(["\'])mailto:([^\\1]*?)\\1[^>]*>(.*?)</a>~is', '[email=$2]$3[/email]', $str);
$str = preg_replace('~<a[^>]*href=(["\'])(http[^\\1]*?)\\1[^>]*>(.*?)</a>~is', '[url=$2]$3[/url]', $str);
$str = preg_replace('~<a[^>]*href=(["\'])(/[^\\1]*?)\\1[^>]*>(.*?)</a>~is', '[url='.$mosConfig_live_site.'$2]$3[/url]', $str);
$str = preg_replace('~<a[^>]*href=(["\'])([^\\1]*?)\\1[^>]*>(.*?)</a>~is', '[url='.$mosConfig_live_site.'/$2]$3[/url]', $str);


Нужно учитывать, что preg_replace может принимать параметры-массивы, да и последние три регулярки можно, навнерное, слить в одну...

Автор: mkredaktor 1.4.2008, 15:13
Хочу выразить всем огромное спасибо, особенно flashaa, ksnk. Хотел сделать +1 в репу.. но у меня сообщений маловато. :(

Автор: MoLeX 2.4.2008, 09:23
Цитата(mkredaktor @  1.4.2008,  15:13 Найти цитируемый пост)
Хочу выразить всем огромное спасибо, особенно flashaa, ksnk. Хотел сделать +1 в репу.. но у меня сообщений маловато. :(

сообщение - дело накопительно, главное на форуме поживей быть  smile
+1 flashaa и ksnk от твоего имени.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)