[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Регулярка ссылки-имейла
DZHETIGAPA
Здравствуйте, уважаемые форумчане! Возник вопрос:

Как написать регулярку дял поиска таких вот строк:

<a href="mailto:xxxxx@mail.ru">YYYYY</a>
<
a class="" href="mailto:xxxxx@mail.ru">YYYYY</a>
<
a id="" class="" href="mailto:xxxxx@mail.ru">mailto:xxxxx@mail.ru</a>
<
a id="" class="" href="mailto:xxxxx@mail.ru"><span>mailto:xxxxx@mail.ru</span></a>


То есть мне надо найти ссылки, где href="mailto:". Но не просто найти данное вхождение, но а выделить всю ссылку целиком.



Как можно организовать такую регулярку?

Заранее благодарен.
Invis1ble
спам - это нехорошо

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

DZHETIGAPA
Так я делаю защиту от спам ботов на сайте, чтобы имейлы подменялись джаваскриптом.

Если бы я хотел спамить, то мне просто регулярки имейла хватило бы))

Так что мне нужно находить все имейлы-ссылки и заменять их джаваскриптом.
Invis1ble
а не лучше ли в таком случае изначально сохранять в нужном виде в БД ?

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

DZHETIGAPA
В каком виде? Сайтов на Битриксе может быть тысяча и у всех все разное. Я делаю универсальное решение, которое при буферизации контента подменяет ссылки-имейлы на скрипты.

Так может мне кто-нибудь помочь в этом?
walerus
$text = '
<a href="mailto:xxxxx@mail.ru">YYYYY</a>
<a class="" href="mailto:xxxxx@mail.ru">YYYYY</a>
<a id="" class="" href="mailto:xxxxx@mail.ru">mailto:xxxxx@mail.ru</a>
<a id="" class="" href="mailto:xxxxx@mail.ru"><span>mailto:xxxxx@mail.ru</span></a>'
;

preg_match_all( '~<a\s.*href="(.*)">(.*)</a>~iUs', $text, $match_1 );
print_r($match_1);

Результ:

Array
(
[0] => Array
(
[0] => <a href="mailto:xxxxx@mail.ru">YYYYY</a>
[1] => <a class="" href="mailto:xxxxx@mail.ru">YYYYY</a>
[2] => <a id="" class="" href="mailto:xxxxx@mail.ru">mailto:xxxxx@mail.ru</a>
[3] => <a id="" class="" href="mailto:xxxxx@mail.ru"><span>mailto:xxxxx@mail.ru</span></a>
)

[1] => Array
(
[0] => mailto:xxxxx@mail.ru
[1] => mailto:xxxxx@mail.ru
[2] => mailto:xxxxx@mail.ru
[3] => mailto:xxxxx@mail.ru
)

[2] => Array
(
[0] => YYYYY
[1] => YYYYY
[2] => mailto:xxxxx@mail.ru
[3] => <span>mailto:xxxxx@mail.ru</span>
)

)

Так нужно ?
DZHETIGAPA
Видимо не так немного. Я переделал под такое вот:


~<a\s.*href=\"(mailto:.*)\">(.*)</a>~iUs


Но все равно не то. Вот кусок кода, попробуй регулярку применить:


<a href="/"><img id="logo" src="/images/logo.png" alt="SHS" title="павпвапа" width="190px" height="73px" /></a>
<ul
id="find-soc">
<li><a
target="_blank" class="find-vk" href="http://vk.com/оропропр">Vkonakte</a></li>
<li><a
target="_blank" class="find-fb" href="http://www.facebook.com/5456465>Facebook</a></li>
<li><a target="
_blank" class="find-tw" href="https://twitter.com/54646">Twitter</a></li>
</ul>
<div class="
header-left">
<ul class="
find-me">
<li>Ищите меня</li>
<li>Мои контакты:</li>
<li><span>+7 921 896 98 55</span></li>
<li><a target="
_blank" href="mailto:testik@mail.ru"><span>testik@mail.ru</span></a>


То эта регулярка выделяет почему-то весь код, а не ссылку на имейл.
walerus
$text = '
<a href="/"><img id="logo" src="/images/logo.png" alt="SHS" title="павпвапа" width="190px" height="73px" /></a>
<ul id="find-soc">
<li><a target="_blank" class="find-vk" href="http://vk.com/оропропр">Vkonakte</a></li>
<li><a target="_blank" class="find-fb" href="http://www.facebook.com/5456465>Facebook</a></li>
<li><a target="_blank" class="find-tw" href="https://twitter.com/54646">Twitter</a></li>
</ul>
<div class="header-left">
<ul class="find-me">
<li>Ищите меня</li>
<li>Мои контакты:</li>
<li><span>+7 921 896 98 55</span></li>
<li><a target="_blank" href="mailto:testik@mail.ru"><span>testik@mail.ru</span></a>'
;

preg_match_all( '~<a\s.*href="mailto:(.*)">(.*)</a>~iU', $text, $match_1 );
print_r($match_1);


Результ

Array
(
[0] => Array
(
[0] => <a target="_blank" href="mailto:testik@mail.ru"><span>testik@mail.ru</span></a>
)

[1] => Array
(
[0] => testik@mail.ru
)

[2] => Array
(
[0] => <span>testik@mail.ru</span>
)

)
walerus
разница в модификаторах...

preg_match_all( '~<a\s.*href="(.*)">(.*)</a>~iUs', $text, $match_1 ); // тут iUs

preg_match_all( '~<a\s.*href="mailto:(.*)">(.*)</a>~iU', $text, $match_1 ); // тут iU, ну и добавлено mailto ))
DZHETIGAPA
Спасибо. Щас все работает. Но возник еще вопрос.

Нужно фактически заменить найденную ссылку на скрипт. Вот читаю док:


Помимо стандартного синтаксиса регулярных выражений, в PHP, совместно с функцией preg_replace() используется еще один дополнительный модификатор - 'e'. Его использование заставляет PHP рассматривать текст замены не как текст, а как PHP код, что дает возможность еще больше расширить сферу применения этой функции в вашем коде. Следующий пример демонстрирует использование этого модификатора - он производит замену всех целых десятичных чисел в тексте на их шестнадцатиричные эквиваленты:

$text = preg_replace("/\d+/e","'0x'.dechex('\\0')",$text);


Я же делаю так:


$text = preg_replace("~<a\s.*href="mailto:(.*)">(.*)</a>~iUe",func('\\0'),$text);


Но видимо ошибка какая-то и страница пустая открывается. Почему не работает модификатор e?
walerus
Потому что неправильно написан preg_replace... на какую функцию нужно менять ?, после preg_match, делаем перебор всех найденных ссылок, и просто используем str_replace()...
DZHETIGAPA
А как правильно preg_replace написать? вроде все по доку.

Функция любая может быть, тут не суть. У меня идет моя функция.
Быстрый ответ:

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