Т.е. надо выделить слова при условии что в слове есть "точка" и после нее идет два или три символа.
Т.е. условие приблизительно такое: \.[a-z]{2,3}
А текст допустим такой:
"Привет, зайди на сайт google.ru или google.com или напиши мне google@google.com"
Надо добавить теги.
Команда preg_replace.
Составил патэрн для выделения сылки на сайт:
$buffer = preg_replace('/(\w+\.+[a-z]{2,3})/',
'<a href="http://$0" target=_blank>$0</a>',
$buffer);
И патэрн для выделения почтовых ссылок:
$buffer = preg_replace('/(\w+\@\w+\.+[a-z]{2,3})/',
'<a href =http:mailto//$0> $0</a>',
$buffer);
Теперь нужна идея как их соеденить вместе. Потомучто если использовать их по отдельности то это будет не правильно.
Конечно можно пройтись вначале первым патэрном а потом написать код если есть @ то добавить mailto.
Т.е. написать еще один патэрн. Ну может у кого будут более продвинутые решения.
Спустя 57 минут, 55 секунд (7.09.2010 - 13:22) DedMorozzz написал(а):
Не надо никак соединять вместе. 2 раза проходи. 2 простые регулярки работают намного быстрее, чем 1 суммарная и сложная.
Спустя 1 час, 3 минуты (7.09.2010 - 14:25) victort написал(а):
Цитата |
Не надо никак соединять вместе. 2 раза проходи. 2 простые регулярки работают намного быстрее, чем 1 суммарная и сложная. |
Два раза пройти не получится. Если запускаю на проверку url-почты то потом запускаеш url-сайта то идет изменени и url-почте так как правило для него является TRUE. и наоборот тоже также он до этого уже обработал сайтовские ссылки к ним добавятся еще изменения для почты.
Каша малаша получается.
Возникает вопрос неужели придется текст разбивать на массив использую в условии пробел, обработать, а потом склеить обратно?
Спустя 20 часов, 58 минут, 31 секунда (8.09.2010 - 11:23) victort написал(а):
Я впринципе придумал как можно решить данную ситуацию. Надо в патэрне прописать границы т.е. использовать \b
Только я никогда границы для патэрна не делал. Надо поискать примеры, может кто подскажет.
Получается надо написать: граница патэрна начинается с символов в которые входит все кроме @ и конец границы \.[a-z]{2,3}.
Получилось вот что в итоге:
$buffer = preg_replace('/(\w[\w\-\.\:\#\%\/\[\]\$\&\_\?]+\@\w[\w\-\.\:\#\%\/\[\]\$\&\_\?]+\.+[a-z]{2,3})/i',
'<a href =http:mailto//$0> $0</a>',
$buffer);
$buffer = preg_replace('/(\w[\w\-\.\:\#\%\/\[\]\$\&\_\?]+\.[a-z]{2,3}\s)/i',
'<a href="http://$0" target=_blank>$0</a>',
$buffer);
print $buffer;
Но есть один минус после "сайт-ссылки" должен быть обязательно пробел. По другому решить проблему не удалось.
Первый прогон выделяет все ссылки на почту а второй прогон выделяет все остальные ссылки.
МОЖЕТ КТОНИБУДЬ УСОВЕРШЕНСТВУЕТ ПАТЭРН???
Кстати можно на этой основе сделать дополнительный прогон который позволит писать ссылки как хочеш т.е. надо убить ненужные дубляжи.
Допустим так, чтоб сильно не парится:
$buffer= str_replace ('http://http://','http://',$buffer);
$buffer= str_replace ('http://ftp://','ftp://',$buffer);
и т.д.
Только я никогда границы для патэрна не делал. Надо поискать примеры, может кто подскажет.
Получается надо написать: граница патэрна начинается с символов в которые входит все кроме @ и конец границы \.[a-z]{2,3}.
Получилось вот что в итоге:
$buffer = preg_replace('/(\w[\w\-\.\:\#\%\/\[\]\$\&\_\?]+\@\w[\w\-\.\:\#\%\/\[\]\$\&\_\?]+\.+[a-z]{2,3})/i',
'<a href =http:mailto//$0> $0</a>',
$buffer);
$buffer = preg_replace('/(\w[\w\-\.\:\#\%\/\[\]\$\&\_\?]+\.[a-z]{2,3}\s)/i',
'<a href="http://$0" target=_blank>$0</a>',
$buffer);
print $buffer;
Но есть один минус после "сайт-ссылки" должен быть обязательно пробел. По другому решить проблему не удалось.
Первый прогон выделяет все ссылки на почту а второй прогон выделяет все остальные ссылки.
МОЖЕТ КТОНИБУДЬ УСОВЕРШЕНСТВУЕТ ПАТЭРН???
Кстати можно на этой основе сделать дополнительный прогон который позволит писать ссылки как хочеш т.е. надо убить ненужные дубляжи.
Допустим так, чтоб сильно не парится:
$buffer= str_replace ('http://http://','http://',$buffer);
$buffer= str_replace ('http://ftp://','ftp://',$buffer);
и т.д.