Как правильно парсить введённую фразу?

NiC

Буратино был тупой
Как правильно парсить введённую фразу?

Скорее всего вопрос задавался, но не могу найти.
Суть такова - что надо испольховать, что бы автоматически генерить ссылки в введённой фразе?
Например, юзер вводит ввв.чё-то_там.ком, а в базу (либо файл, неважно) вписывалась бы уже сгенерированая ссылка - хттп://ввв.чё-то_там.ком

Надеюсь, не очень запутано..
 

Фанат

oncle terrible
Команда форума
кстати, кто-нибудь может привести не монстроидальный и качественный рег подсветки ссылок?

можно было бы в фак вставить...
 

fixxxer

К.О.
Партнер клуба
не знаю, насколько это качественно и немонстроидально:) но я юзаю такой рег:

$text = preg_replace("~((http://|ftp://)([-a-z0-9_.]+[.][a-z]{2,4}[^\"'\n\r\t ]*))~", "<a href=\"\\1\">\\1</a>",$text);
 

Falc

Новичок
Тогда уж лучше так:
PHP:
$text = preg_replace( "~((http://|ftp://)([-\w\d\.]+\.[\w]{2,4}[^\s\"']*))~i", "<a href=\\1>\\1</a>", $text );
Хотя в конечной части:
[^\s\"']*
Можно перечислить побольше недопустимых символов :)
 

fixxxer

К.О.
Партнер клуба
Falc, я все никак не запомню все эти \w и \d... :)

А вот как бы покрасивше сделать так, чтобы нормально подсвечивало и ссылки вида http://www.xxx.com , и www.xxx.com ? В обоих случаях, естественно, ссылка должна генериться как <a href="http://www.xxx.com">. Кроме как использовать массивы в preg-е (и, значит, юзать, по сути, два регекспа) - ничего в голову не приходит...
 

Falc

Новичок
Originally posted by fixxxer
Falc, я все никак не запомню все эти \w и \d... :)
А зачем их помнить, мануал открывай и смотри :)

А вот по поводу: наличия http:// и его отсутствия, это уже гимор ведь URL'ы могут начинаться не только с www.

Но в примитивном случае мона сделать так:
PHP:
$text = preg_replace( "~((http://|ftp://|www\.)([-\w\d\.]+\.[\w]{2,4}[^\s\"']*))~i", "<a href=\\1>\\1</a>", $text );
 

rembo

Новичок
можно схитрить и перечислить домены которые вероятнее всего будут попадаться .com .ru .net .org и т.д.
чево нибудь типа /^\s[^\s"'?%\*$\(\)\[\]\{\}\+\-\/\\]+\.(com|ru|net|org|..|..)[^\s"'\*\(\)\[\]\{\}\+\-\/\\]*/i
правда довольно много перечислять придется.
 

fixxxer

К.О.
Партнер клуба
Но в примитивном случае мона сделать так:
$text = preg_replace( "~((http://|ftp://|www\.)([-\w\d\.]+\.[\w]{2,4}[^\s\"']*))~i", "<a href=\\1>\\1</a>", $text );
..и получится лажа: <a href=www.xxx.com/mm>www.xxx.com/mm</a>
 

Фанат

oncle terrible
Команда форума
дл первых двух паттерн
'#(https?|ftp)://\S+[^\s.,>)\];\'"!?]#'
(c) mivlad

-~{}~ 09.02.04 15:58:

а для третьего (которого не бывает никогда), паттерн есть в разделе "статьи" в статье про регулярные выражения.
 

василыч

Guest
PHP:
function ereg_url($in)
{
	$url_pattern = "(".
	"(http://www\\.|http://|www\\.)".							//протокол
	"([a-z0-9\\-_\\.]+/?\\.([a-z]{2,4})/?".						//домены и ру
	"([a-z0-9\\-_\\./]+)?".										//имя файла и папки
	"(\\?[a-z0-9\\-_&=;#]+)?)".								 	//и параметры
	")i";
	
	$in = preg_replace($url_pattern,"<a target=\"_blank\" href=\"\\1\\2\" title=\"Открыть внешнюю ссылку\">\\1\\2</a>", $in);

return $in;
}
 

василыч

Guest
>глупость и ограниченность

это не ограниченость, а так надо.

одни пишут ссылки так: www.server.com, другие - http://www.server.com, третьи - http://server.com

Просто хотелось всё под одну гребёнку... хотя https не прокатит....

-~{}~ 10.02.04 13:36:

глупость какая-то...
можно вместо href=\"http://www.\\2\" написать href=\"\\1\\2\" и тогда ссылка вида www.server.com будет броузером интерпритироваться как http://test4.ru/www.server.com !!!

-~{}~ 10.02.04 13:38:

даже на этом форуме ссылка преобразовалась в <a href="http://www.server.com" target="_blank"> с префиксом http.

-~{}~ 10.02.04 13:39:

так што, это не ограниченость.

-~{}~ 10.02.04 13:48:

Чё то- я не пойму: Preg_replace:
Replacement может содержать ссылку в форме \\n или (начиная с PHP 4.0.4) $n, где последняя форма предпочтительнее. Каждая такая ссылка замещается текстом, захваченным n'ным патэрном в скобках. n может быть от 0 до 99, а \\0 или $0 ссылаются на текст, совпавший со всем патэрном. Открывающие скобки подсчитываются слева направо (начиная с 1) для получения количества захватывающих субпатэрнов.

так почему у меня в патэрне первая захватывающая скобка субпатерна играет роль второй? Причём это работает...
 

Фанат

oncle terrible
Команда форума
одни пишут ссылки так: www.server.com, другие - http://www.server.com, третьи - http://server.com
это не они пишут ссылки, чудик.
это у серверов такие адреса.
если у одникх одни совпадают, то это не значит, что ввв - это такая константа, которая есть у всех, чучело ты гороховое, глаза бы мои на тебя не глядели
 
Сверху