Поиск e-mail и замена на url

Статус
В этой теме нельзя размещать новые ответы.

s0lo

Создатель
Регистрация
24 Дек 2006
Сообщения
47
Реакции
4
Помогите решить проблему:
В произвольном тексте нужно найти e-mail адрес в тексте и заменить его на ссылку типа:
Код:
<a href="mailto:е-mail">e-mail</a>
Делаю так как в коде приведенном ниже, но всё это работает если в тексте попадается просто e-mail и e-mail обрамленный в тэг.
А хочется, чтобы адреса заключенные в тэг <a href="mailto:е-mail">е-mail</a> не заменялись.
PHP:
$str_t = "1 адрес <a href=\"#\">a.dd-g@ab-cd_4.com.ru</a> <br>
          2 адрес abc-abc@abcdefg.ru <br>
          3 адрес <a href=\"mailto:abc-abc@abcdefg.ru\">abc-abc@abcdefg.ru</a>";
	$pattern = '/([0-9a-z_.-])+@([a-z0-9.-]+.[a-z]{2,4})/is';
	$replacement = '<a href="mailto:$0">$0</a>';
	echo " результат :<br>".preg_replace($pattern, $replacement, $str_t);
т.е. нада чтобы в приведенном примере заменился только 2 адрес, а адреса найденные в остальных строках остались неизменны.
Помогите советом.
 
можно так...
PHP:
<?php
$str_t = "1 адрес <a href=\"#\">a.dd-g@ab-cd4.com.ru</a> <br>
          2 адрес abc-abc@abcdefg.ru <br>
          3 адрес <a href=\"mailto:abc-ab2c@ab2cdefg.ru\">ab2c-abc@ab2cdefg.ru</a>";
$email_pattern = '[a-z0-9_.-]+@[a-z0-9.-]+\.[a-z]{2,4}';
$pattern = "!(?:<a\s+href\s*=\s*\"mailto:($email_pattern)\">[^<]+</a>|($email_pattern))!is";
$replacement = '<a href="mailto:$1$2">$1$2</a>';
echo " результат :<br>".preg_replace($pattern, $replacement, $str_t);
?>
 
  • Нравится
Реакции: s0lo
SolarWind, спасиб, это полностью решило мою проблему, хоть и первый адрес из моего примера всёравно заменяется.
В который раз убеждаюсь, что регулярки очень удобная и полезная вещь и что нада учиться их составлять.
 
спасиб, это полностью решило мою проблему, хоть и первый адрес из моего примера всёравно заменяется.
Пожалуйста :)
Я думал в нем ошибка и убрал из него знак _, видимо поэтому и заменяется... Также обрати внимание, что в регулярке для емэйла, должен стоять слэш пред точкой \. Так как точка без слэша - это произвольный символ, а в любом домене обязательно должна быть точка.

P.S.
Упустил из виду, что первый емэйл тоже в виде ссылки, можно такие тоже захватывать похожей регуляркой...
PHP:
<?php
$str_t = "1 адрес <a href=\"#\">a.dd-g@ab-cd4.com.ru</a> <br>
          2 адрес abc-abc@abcdefg.ru <br>
          3 адрес <a href=\"mailto:abc-ab2c@ab2cdefg.ru\">ab2c-abc@ab2cdefg.ru</a>";
$email_pattern = '[a-z0-9_.-]+@[a-z0-9.-]+\.[a-z]{2,4}';
$pattern = "!(?:<a\s+href\s*=\s*\"[^\"]\">($email_pattern)</a>|<a\s+href\s*=\s*\"mailto:($email_pattern)\">[^<]+</a>|($email_pattern))!is";
$replacement = '<a href="mailto:$1$2$3">$1$2$3</a>';
echo " результат :<br>".preg_replace($pattern, $replacement, $str_t);
?>
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху