Регулярные выражения PREG

Solid

Drosera anglica
Регулярные выражения PREG

Доброе время суток.
Бьюсь над проблеммой, не могу решить. В общем есть строка:
PHP:
$link = 'Text. Here is link: http://www.link.com/somelinkhere/is.php?and=asas&lal=2-s. Here is another text.';
И есть строка превращающая текстовые ссылки в linkи:
PHP:
preg_replace("`((http)+(s)?:(//)|(www\.))((\w|\.|\-|_)+)(/)?([^\s]+)?`i", "<a href=\"\\0\" title=\"\\0\">\\5\\6</a>", $text);
Что не работает? Надо сделать так, что бы если на конце ссылки есть "." или "," - остановить вырезку ссылки. Т.е. в данном случае вырежется ссылка вместе с точкой на конце.
 

Burunduk-13

[CBT], Старожил РНРClub'a
Возьми готовые паттерны УРЛ, зачем изобретать велосипед?
http://regexplib.com/DisplayPatterns.aspx?cattabindex=1&categoryId=2

а если "Надо сделать так, что бы если на конце ссылки есть "." или ",""
Так и задай явно в паттерне, что УРЛ долен заканчиваться на \w
 

serglt

Анус, ой, Ахтунг
PHP:
function to_html ($str, $wrap = 0)
    {
        $str = str_replace ("\r", "", $str);
        $str = htmlspecialchars ($str);
        if ($wrap != 0)
            $str = preg_replace ("/((\S{" . $wrap . "})(\S))|" .
                                 "(([А-ЯA-Z]{" . ((int)($wrap /  2)) . "})([А-ЯA-Z]))/", "\\2\\5<br>\\3\\6", $str);
        $str = str_replace ("\n", "<br>", $str);
        $str = preg_replace ("/((http:\/\/.+?)(\s))|((http:\/\/.+?)$)/e",
                           "'<a href=\"' . str_replace ('<br>', '', '\\2\\5').  '\" target=\"_blank\" class=\"a-10-red\">\\2\\5</a>\\3'", $str);
        return $str;
    }
 

Solid

Drosera anglica
Автор оригинала: Burunduk-13
Возьми готовые паттерны УРЛ, зачем изобретать велосипед?
http://regexplib.com/DisplayPatterns.aspx?cattabindex=1&categoryId=2

а если "Надо сделать так, что бы если на конце ссылки есть "." или ",""
Так и задай явно в паттерне, что УРЛ долен заканчиваться на \w
Получилось только так:
PHP:
function hyperlink(&$text)
{
$text = preg_replace("`((http)+(s)?:(//)|(www\.))((\w|\.|\-|_)+)(/)?([^\s]+)?([\w])`i", "<a href=\"\\0\" title=\"\\0\">\\0</a>", $text);// \\5\\6

preg_match_all("|<a href=\"[^>]+\" title=\"[^>]+\">([^<]+)</a>|U", $text, $out);
$count = count($out[1]);

if($count>0) {
	for($i=0; $i<$count; $i++) {
		$url = parse_url($out[1][$i]);
		$text = str_replace('">'.$out[1][$i].'</a>', '">'.$url['host'].'</a>', $text);
	}
}
}
 

sage

Новичок
Solid
$text = preg_replace("`((http)+(s)?:(//)|(www\.))((\w|\.|\-|_)+)(/)?([^\s]+)?([\w])`i", "<a href=\"\\0\" title=\"\\0\">\\0</a>", $text);
у тебя очень много лишних ( и ). Зачем ты их вообще ставишь, если потом не пользуешься тем, для чего они предназначены?
 

Solid

Drosera anglica
Автор оригинала: sage
Solid

у тебя очень много лишних ( и ). Зачем ты их вообще ставишь, если потом не пользуешься тем, для чего они предназначены?
Согласен, кое-что лишнее, но не всё.
 

sage

Новичок
может быть, конечно, не идеально, но попробуй :)
PHP:
preg_match_all('#(https?://[^ ]+)(?=[.,]|[.,]$)#', $text, $matches, PREG_SET_ORDER);
 

Solid

Drosera anglica
`((http)+(s)?:(//)|(www\.))([^\s]+)?([\w])`i

-~{}~ 14.01.06 07:03:

Автор оригинала: sage
может быть, конечно, не идеально, но попробуй :)
PHP:
preg_match_all('#(https?://[^ ]+)(?=[.,]|[.,]$)#', $text, $matches, PREG_SET_ORDER);
А ты читал, что мне вообще нужно?
 

sage

Новичок
ну и в чём проблема? я те привёл выражение, которое вырезает ссылки. Ты не можешь подставить его в preg_replace?

-~{}~ 14.01.06 14:07:

Надо сделать так, что бы если на конце ссылки есть "." или "," - остановить вырезку ссылки.
а я что привел?

-~{}~ 14.01.06 14:08:

в вопросе ничего нет про формирование ссылки, вопрос про вырезку ссылок
 

Solid

Drosera anglica
Автор оригинала: sage
ну и в чём проблема? я те привёл выражение, которое вырезает ссылки. Ты не можешь подставить его в preg_replace?

-~{}~ 14.01.06 14:07:


а я что привел?
Говорить легко, а на примере код:
PHP:
<?

$link = 'Text. Here is link: [url]http://www.link.com/somelinkhere/is.php?and=asas&lal=2-s[/url] Here is another text.';
$link = preg_replace("#(https?://[^ ]+)(?=[.,]|[.,]$)#", "<a href=\"\\0\" title=\"\\0\">\\0</a>", $link);
echo $link;

?>
показывает:
Text. Here is link: <a href="http://www.link.com/somelinkhere/is" title="http://www.link.com/somelinkhere/is">http://www.link.com/somelinkhere/is</a>.php?and=asas&lal=2-s Here is another text.

-~{}~ 14.01.06 07:12:

Согласен что вопрос задан несколько некорректно.
В общем надо в тексте изменить ссылки. Ссылки даны в форме http://lala.com/some.php?and=here&is=some&link=here. Естественно протоколы у ссылок могут быть разные, как ftp, так и https. На конце могут быть знаки припинания, а так же () [] и прочие знаки.
 

sage

Новичок
а ты что хотел? теперь я тебя вообще не понимаю. сначала ты привёл один текст с ссылкой, сейчас текст совершенно другой. ты уж определись, в каком виде у тебя в тексте ссылки.

-~{}~ 14.01.06 14:13:

и от этого и шлёпай
 

Solid

Drosera anglica
Автор оригинала: sage
а ты что хотел? теперь я тебя вообще не понимаю. сначала ты привёл один текст с ссылкой, сейчас текст совершенно другой. ты уж определись, в каком виде у тебя в тексте ссылки.
В том то и дело, что ссылки могут быть разного вида. В общем я решение нашёл, работает оно, конечно, не самым быстрым образом, но о скорости мне пока ещё беспокоиться рано. Элегантное решение, ввиде одной строчки найти можно, но ради этого, надо будет потрать уйму времени, с этими order'ами, всякими ?= разобраться... Я насамом деле уже кучу времени убил.. впрочем, чего вдаваться в дальнейшие размышления, объяснения... полный оффтоп.
 
Сверху