遇到两个需求,需要将内容的的url自动加入a链接,可以直接点击,另外一个是需要将内容中的url替换成短链接,其实就是实现类似新浪微博那样。
比如内容为:我是徐鹏,我的博客网址为:devops.jiunile.com
将以上内容替换为:我是徐鹏,我的博客网址为:<a href="devops.jiunile.com" target="_blank">xp.cn/6A3ihJ0</a>
实现方式如下:
define('SHORTURL', 'xp.cn'); //调用方法 $processContent = formatContent('我是徐鹏,我的博客网址为:devops.jiunile.com'); $autoLinkContent = autolink($processContent); echo $autoLinkContent; function formatContent($content) { $URL_VALID_PRECEEDING_CHARS = "(?:[^/\"':!=]|^|\\:)"; $URL_VALID_DOMAIN = "(?:[\\.-]|[^\\p{P}\\s])+\\.[a-z]{2,}(?::[0-9]+)?"; $URL_VALID_URL_PATH_CHARS = "[\x80-\xff_a-z0-9!\\*'\\(\\);:&=\\+\\$/%#\\[\\]\\-_\\.,~@]"; $URL_VALID_URL_PATH_ENDING_CHARS = "[\x80-\xff_a-z0-9\\)=#/]"; $URL_VALID_URL_QUERY_CHARS = "[\x80-\xff_a-z0-9!\\*'\\(\\);:&=\\+\\$/%#\\[\\]\\-_\\.,~]"; $URL_VALID_URL_QUERY_ENDING_CHARS = "[\x80-\xff_a-z0-9_&=#]"; $VALID_URL_PATTERN_STRING = '$(' . "(" . $URL_VALID_PRECEEDING_CHARS . ")" . "(" . "(https?://|www\\.)" . "(" . $URL_VALID_DOMAIN . ")" . "(/" . $URL_VALID_URL_PATH_CHARS . "*" . $URL_VALID_URL_PATH_ENDING_CHARS . "?)?" . "(\\?" . $URL_VALID_URL_QUERY_CHARS . "*" . $URL_VALID_URL_QUERY_ENDING_CHARS . ")?" . ")" . ')$i'; return preg_replace_callback($VALID_URL_PATTERN_STRING, 'replaceUrls',$content); } function replaceUrls($matches) { $replacement = $matches[2]; if (substr($matches[3], -1, 1) == "[") { $matches[3] = substr($matches[3], 0, -1); $append = "["; } else { $append = ""; } if( !empty($matches[3]) ) { $original = (substr($matches[3], 0, 7) == 'http://' || substr($matches[3], 0, 8) == 'https://') ? $matches[3] : 'http://'.$matches[3]; $short = shortUrl($original); //下面根据$short 去检查数据库里是否存在shortUrl 如果不存在,需要插入对应的记录。 ...... $replacement .= SHORTURL . '/' . $short; } $replacement .= $append; return $replacement; } function shortUrl($url) { $base32 = array ( '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', 'e', 'E', 'f', 'F', 'g', 'G', 'h', 'H', 'i', 'I', 'j', 'J', 'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N', 'o', 'O', 'p', 'P', 'q', 'Q', 'r', 'R', 's', 'S', 't', 'T', 'u', 'U', 'v', 'V', 'w', 'W', 'x', 'X', 'y', 'Y', 'z', 'Z' ); $hex = md5($url); $hexLen = strlen($hex); $subHex = substr ($hex, 0, 8); $int = 0x3FFFFFFF & (1 * ('0x'.$subHex)); $out = ''; for ($j = 0; $j < 7; $j++) { $val = 0x0000001F & $int; $out .= $base32[$val]; $int = $int >> 5; } return $out; } function autolink($tweet) { $VALID_URL_PATTERN_STRING = '$('.SHORTURL.'/[a-zA-Z0-9]{7})$i'; return preg_replace_callback($VALID_URL_PATTERN_STRING, 'replacementURLs',$tweet); } function replacementURLs($matches) { $arr = explode('/',$matches[0]); //根据$arr[0](shortUrl) 去查找对应数据库里的正式url地址 // $url 从数据库里取出 $replacement = '<a href="' . $url . '" target="_blank">' . $matches[0] . '</a>'; return $replacement; }