Tự động chuyển Url trong chuỗi thành link bài viết bằng PHP

15/01/2014

Thỉnh thoảng, trong các bài viết, chúng ta thường chèn những địa chỉ (url) của những trang web khác vào bên trong nội dung. Nếu như ta dùng các trình soạn thảo để gắn link cho từng url thì sẽ rất mất công và tốn thời gian.

Tự động  chuyển Url trong chuỗi thành link bài viết bằng PHP

Hôm nay mình tiếp tục chia sẻ cho các bạn một đoạn code bằng PHP. Đoạn code này sẽ tự động nhận dạng các url trong bài viết, rồi biến nó thành dạng link có thể liên kết được. Để dễ hiểu, các bạn có thể tham khảo cách dùng như sau :

$string = 'I have some texts here and also links such as http://www.youtube.com , www.thuthuatweb.net and lol@example.com. They are ready to be replaced.';
echo make_clickable($string);

Như các bạn đã thấy ở đoạn code bên trên, ngoài các url là các địa chỉ trang web, chúng ta còn có thể tự động tạo link cho các địa chỉ email. Và đây, không để các bạn chờ lâu nữa, để tạo được tính năng này, các bạn copy toàn bộ đoạn PHP bên dưới để sử dụng cho những mục đích của mình.

function _make_url_clickable_cb($matches) {
	$ret = '';
	$url = $matches[2];
	if ( empty($url) )
		return $matches[0];
	// removed trailing [.,;:] from URL
	if ( in_array(substr($url, -1), array('.', ',', ';', ':')) === true ) {
		$ret = substr($url, -1);
		$url = substr($url, 0, strlen($url)-1);
	}
	return $matches[1] . "<a href=\"$url\" rel=\"nofollow\">$url</a>" . $ret;
}
function _make_web_ftp_clickable_cb($matches) {
	$ret = '';
	$dest = $matches[2];
	$dest = 'http://' . $dest;
	if ( empty($dest) )
		return $matches[0];
	// removed trailing [,;:] from URL
	if ( in_array(substr($dest, -1), array('.', ',', ';', ':')) === true ) {
		$ret = substr($dest, -1);
		$dest = substr($dest, 0, strlen($dest)-1);
	}
	return $matches[1] . "<a href=\"$dest\" rel=\"nofollow\">$dest</a>" . $ret;
}
function _make_email_clickable_cb($matches) {
	$email = $matches[2] . '@' . $matches[3];
	return $matches[1] . "<a href=\"mailto:$email\">$email</a>";
}
function make_clickable($ret) {
	$ret = ' ' . $ret;
	// in testing, using arrays here was found to be faster
	$ret = preg_replace_callback('#([\s>])([\w]+?://[\w\\x80-\\xff\#$%&~/.\-;:=,?@\[\]+]*)#is', '_make_url_clickable_cb', $ret);
	$ret = preg_replace_callback('#([\s>])((www|ftp)\.[\w\\x80-\\xff\#$%&~/.\-;:=,?@\[\]+]*)#is', '_make_web_ftp_clickable_cb', $ret);
	$ret = preg_replace_callback('#([\s>])([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})#i', '_make_email_clickable_cb', $ret);
	// this one is not in an array because we need it to run last, for cleanup of accidental links within links
	$ret = preg_replace("#(<a( [^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i", "$1$3</a>", $ret);
	$ret = trim($ret);
	return $ret;
}

Mình mong là đoạn code bên trên sẽ hữu ích cho các bạn, nhớ chia sẻ bài viết cho bạn bè của mình nhá . Và đừng quên để lại lời nhắn dưới dạng comments nếu bạn có bất kì thắc mắc nào trong bài viết này.

Chúc các bạn thành công !

Chuyên Mục:

Bài viết được đăng bởi webmaster

Nếu các bạn thấy bài viết hữu ích thì giúp mình Like cái nhé !