Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция автоматической замены 
:(
    Опции темы
SDEVIL
Дата 12.7.2007, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 30.10.2006

Репутация: нет
Всего: 1



Такая задача: есть текст, текст берется из формы которую заполняет пользователь, при этом html тэги разрешены, необходимо найти в тексте ссылки на сайты(пример: www.site.ru || site.ru || http://site.ru и т.д.) которые написаны просто как текст(по которым нельзя щелкнуть для перехода), и сделать их полноценными ссылками (пример: <a href="http://www.site.ru">www.site.ru</a>)  т.е. сделать автозамену, но при этом в тексте так же могут присутствовать и нормальные ссылки (пример: <a href="http://www.site.ru">www.site.ru</a>) - их нельзя трогать они должны остаться как есть, вот не знаю как организовать??
Как сделать замену на нормальные ссылки я знаю, а вот чтобы не затрагивать ссылки уже готовые не знаю....


 ! 
PARROT
Можно узнать? А чем Вы руководствовались при выборе раздела для своей темы? Почему разместили РНР для профи?


Это сообщение отредактировал(а) PARROT - 12.7.2007, 17:22
--------------------
Подпись сбежала к другому юзверю....
PM MAIL   Вверх
sTa1kEr
Дата 12.7.2007, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 5
Всего: 146



Все же люблю я регулярные выражения smile Хотя одной регуляркой тут, конечно не обойтись. Точнее можно и одной регуляркой, но только тогда не все варианты будут учтены. Собственно сам код:
Код

class LinkHandling
{
   private static $isA = false;
   const patten = "#((?(?=</?\w+)<(/?\w+)\s?[^>]*>|(www\.|(http|ftp)s?://)[a-z\d]+(?:\.[a-z\d]+)*(/[a-z\d+\-_\.,%&/?=\#\[\]*!~']*)?))#";

   public static function Run($str)
   {
      self::$isA = false;
      return preg_replace_callback(self::patten, array("self", "Replace"), $str);
   }

   public static function Replace($m)
   {
      if (!empty($m[2]))
      {
         if ($m[2] == "a") self::$isA = true;
         else if ($m[2] == "/a") self::$isA = false;
         return $m[0];
      }
      else if (self::$isA) return $m[0];
      return "<a href=\"{$m[1]}\">{$m[1]}</a>";
   }
}

$txt = "<a href='javascript:void(0);'><b>www.my.ru</b></a> || <a href=\"http://www.site.ru/\">http://www.site.ru/</a> || <img src=\"http://www.site2.com\"> || www.site5.ru/a+b/index.html<br> || http://ya.ru/?s=qwwe&g=123<div alt=\"http://haha.ru/\">";
echo LinkHandling::Run($txt);

Почему написал именно класс? Что бы не прибегать к глобальным переменным(бррр...), а без них бы не обошлось. Если я ничего не упустил, то он не портит ни один тег и не подставляет ссылки между тегов <a> и </a>. Имхо, получилось очень красиво smile
PM MAIL   Вверх
SDEVIL
Дата 16.7.2007, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 30.10.2006

Репутация: нет
Всего: 1



Прошу прощения..
Скрипт я протестировал и все работает, спасибо большое....
А как написать регулярное выражение для e-mailов т.е. так же как и с ссылками, но чтобы еще и с емайлами также было в виде ссылок, при нажатии на которую открывается почтовая программа...
--------------------
Подпись сбежала к другому юзверю....
PM MAIL   Вверх
sTa1kEr
Дата 17.7.2007, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 5
Всего: 146



Цитата(SDEVIL @  16.7.2007,  16:58 Найти цитируемый пост)
А как написать регулярное выражение для e-mailов

Принципиально все тоже самое, только чуть доработать шаблон.
Код

class LinkHandling
{
   private static $isA = false;
   const patten = "#(?(?=</?\w+)<(/?\w+)\s?[^>]*>|(?:www\.|[a-z\d][a-z\d.\-_]*(@)|(?:http|ftp)s?://)[a-z\d]+(?:\.[a-z\d]+)*(/[a-z\d+\-_\.,%&/?=\#\[\]*!~']*)?)#";

   public static function Run($str)
   {
      self::$isA = false;
      return preg_replace_callback(self::patten, array("self", "Replace"), $str);
   }

   public static function Replace($m)
   {
      if (!empty($m[1]))
      {
         if ($m[1] == "a") self::$isA = true;
         else if ($m[1] == "/a") self::$isA = false;
         return $m[0];
      }
      else if (self::$isA) return $m[0];
      return "<a href=\"".(isset($m[2]) && $m[2] == "@" ? "mailto:{$m[0]}" : $m[0] )."\">{$m[0]}</a>";
   }
}


PM MAIL   Вверх
SDEVIL
Дата 24.7.2007, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 30.10.2006

Репутация: нет
Всего: 1



заметил такую штуку, если в тексте написано: www.site.ru то получается <a href="www.site.ru">www.site.ru</a> и такая ссылка не работает, а если написано http://www.site.ru то тогда все работает, как можно это исправить?
--------------------
Подпись сбежала к другому юзверю....
PM MAIL   Вверх
Anarki
Дата 27.7.2007, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 14.3.2005

Репутация: 2
Всего: 11



Код

return "<a href=\"".(isset($m[2]) && $m[2] == "@" ? "mailto:{$m[0]}" : (strpos(strtolower($m[0]),'http://') !== 0) ? 'http://'.$m[0] : $m[0] )."\">{$m[0]}</a>";



--------------------
PM WWW   Вверх
SDEVIL
Дата 28.7.2007, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 30.10.2006

Репутация: нет
Всего: 1



Цитата(Anarki @ 27.7.2007,  23:47)
Код

return "<a href=\"".(isset($m[2]) && $m[2] == "@" ? "mailto:{$m[0]}" : (strpos(strtolower($m[0]),'http://') !== 0) ? 'http://'.$m[0] : $m[0] )."\">{$m[0]}</a>";

Работать стало, но теперь перестало работать с емайлом т.е. если написано <a href='mailto:[email protected]'>[email protected]</a> - то скрипт не трогает строку, а если написано [email protected] - то получается ссылка вот такого вида - <a href='http://[email protected]'>[email protected]</a> 
вместо <a href='mailto:[email protected]'>[email protected]</a> 
--------------------
Подпись сбежала к другому юзверю....
PM MAIL   Вверх
Anarki
Дата 28.7.2007, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 14.3.2005

Репутация: 2
Всего: 11



Код

class LinkHandling
{
   private static $isA = false;
   const patten = "#(?(?=</?\w+)<(/?\w+)\s?[^>]*>|(?:www\.|[a-z\d][a-z\d.\-_]*(@)|(?:http|ftp)s?://)[a-z\d]+(?:\.[a-z\d]+)*(/[a-z\d+\-_\.,%&/?=\#\[\]*!~']*)?)#";
   public static function Run($str)
   {
      self::$isA = false;
      return preg_replace_callback(self::patten, array("self", "Replace"), $str);
   }
   public static function Replace($m)
   {
      if (!empty($m[1]))
      {
         if ($m[1] == "a") self::$isA = true;
         else if ($m[1] == "/a") self::$isA = false;
         return $m[0];
      }
      else if (self::$isA) return $m[0];
      if (isset($m[2]) && $m[2] == "@") {
        $link = 'mailto:'.$m[0];
      } else {
         $link = (strpos(strtolower($m[0]),'http://') !== 0 && strpos(strtolower($m[0]),'mailto:') === false ) ? 'http://'.$m[0] : $m[0];
      }
      return '<a href="'.$link.'">'.$m[0].'</a>';
   }
}



--------------------
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.0808 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.