Регуляр для хитрых url.

Tonn

Новичок
Регуляр для хитрых url.

есть текст с ссылками вида:
1: www.ru или http://www.ru
2: <a href="www.ru"> по данным сайта www.ru</a>.
3: <a href="www.ru">www.ru</a>

Нужно заменить на "здесь была плохая ссылка" только 1 тип, не задевая остальные.
Помогите с регом, плиз.


Проверочный текст:
PHP:
 $word1 = " один  http://www.ra два три четыре www.rb пять <br>";
 $word1 .= " шесть <a href=\"http://www.rc\" target=\"_blank\">www.rc</a>  семь восемь <br>";
 $word1 .= " девять <a href=\"http://www.rd\">по данным сайта www.rd</a>  десять одиннадцать";
На выходе только первые две ссылки (www.ra и http://www.rb) должны замениться на "здесь была плохая ссылка".

PS:
На маны медитировал.
 

Nirva

Dmitry Polyakov
что у тебя должно быть обязательно перед и после ссылки?
правильно! пробел! вот и добавляй пробел.
 

Vlad DraKula

Guest
Tonn
если я правельно понял, то ты хочешь заменить все адреса которые не были оформлены как ссылки на "здесь была плохая ссылка" ?

-~{}~ 17.06.04 23:20:

Tonn
перечитал твой посто еще раз понял что именно ты хочешь.

однажды я видел такой регексп, в движке инвизона такой применяется!

PHP:
				$raw = preg_replace( "#(^|\s)((http|https|news|ftp)://\w+[^\s\[\]]+)#ie",
						     "\ regex_build_url(array('html' => '\\2', 'show' => '\\2', 'st' => '\\1'))",
           	    	             $raw );
PHP:
function regex_build_url($url=array())
{
	$skip_it = 0;

	// Make sure the last character isn't punctuation.. if it is, remove it and add it to the
	// end array
	if ( preg_match( "/([\.,\?]|&#33;)$/", $url['html'], $match) )
	{
		$url['end'] .= $match[1];
		$url['html'] = preg_replace( "/([\.,\?]|&#33;)$/", "", $url['html'] );
		$url['show'] = preg_replace( "/([\.,\?]|&#33;)$/", "", $url['show'] );
	}

	// Make sure it's not being used in a closing code/quote/html or sql block
	if (preg_match( "/\[\/(html|quote|code|sql)/i", $url['html']) )
		return $url['html'];

	// clean up the ampersands
	$url['html'] = preg_replace( "/&amp;/" , "&" , $url['html'] );

	// Make sure we don't have a JS link
	$url['html'] = preg_replace( "/javascript:/i", "java script&#58; ", $url['html'] );

	// Do we have http:// at the front?
	if ( ! preg_match("#^(http|news|https|ftp|aim)://#", $url['html'] ) )
		$url['html'] = 'http://'.$url['html'];

	//-------------------------
	// Tidy up the viewable URL
	//-------------------------
	if ( preg_match( "/^<img src/i", $url['show'] ) )
    	$skip_it = 1;

	$url['show'] = preg_replace( "/&amp;/" , "&" , $url['show'] );
	$url['show'] = preg_replace( "/javascript:/i", "javascript&#58; ", $url['show'] );

	if ( (strlen($url['show']) -58 ) < 3 )
		$skip_it = 1;

	// Make sure it's a "proper" url
	if ( !preg_match( "/^(http|ftp|https|news):\/\//i", $url['show'] ) )
		$skip_it = 1;

	$show = $url['show'];
	if ($skip_it != 1)
	{
		$stripped = preg_replace( "#^(http|ftp|https|news)://(\S+)$#i", "\\2", $url['show'] );
		$uri_type = preg_replace( "#^(http|ftp|https|news)://(\S+)$#i", "\\1", $url['show'] );
		$show = $uri_type.'://'.substr( $stripped , 0, 35 ).'...'.substr( $stripped , -15   );
	}

    // ????? ??????????
	return $url['st'] . "<a href=\"".$url['html']."\" target=\"_blank\">".$show."</a>" . $url['end'];
}
осталось ее немного модифичировать...
 

Tonn

Новичок
Tonn
перечитал твой посто еще раз понял что именно ты хочешь.

однажды я видел такой регексп, в движке инвизона такой применяется!

осталось ее немного модифичировать...
Да уж... Нехилый рег.
Спасибо.
Только форум всю функцию убил.
Господа, кто в состоянии, сделайте код читаемым, пожалуйста.
 

Vlad DraKula

Guest
Tonn
честно говоря форум практически ничего не убил, форум просто добал несколько переносов строк там где не нужно.

эту функуиб надо еще немного переделывать т.к. она делает почти то что тебе надо но не совсем!
 

Tonn

Новичок
Ну, еще картинок понапихал...
В общем, функция делает не совсем то и переделывать там вроде как нечего, ибо получится с нуля написание.
 
Сверху