note 74582 added to function.preg-replace
| From: | marten_berglund at hotmail dot com | Date: | Wed, 18 Apr 2007 15:20:01 +0000 |
| Subject: | note 74582 added to function.preg-replace | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-125546@lists.php.net to get a copy of this message | ||
I couldn't find any url2html-solution here that met all these three criteria:
1) Make links of standard web-urls (http://some.com), urls without http (some.com) and emails
2) Urls from all possible protocols (not just http and ftp)
3) To not link delimiter characters surrounding a link, e.g. "My site (www.site.com) is
good!"
The following code takes care of all this. It is easy to below add extra characters that you
don't want in the beginning/end of a link, and to add extra abbreviations that should not be
linked (below adopted for some common english ones). By disallowing digits in the end of an url,
time stamps like 04.57 won't be linked.
It seems to work fine with almost any imaginable url but please feel free to make corrections.
<?php
function linkify($text) {
$strip_lchrs = "[^\s\(\)\[\]\{\}\.\,\;\:\?\!]"; //Not these chars in beginning
$strip_rchrs = "[^\s\(\)\[\]\{\}\.\,\;\:\?\!\d]"; //Not these chars in end
$prot_pat = $strip_lchrs . "[\S]*\:\/\/[\S]*\.[\S]*" . $strip_rchrs; //abc://de.fg
$email_pat = $strip_lchrs . "[\S]*@[\S]*\.[\S]*" . $strip_rchrs; //abc@de.fg
$general_pat = $strip_lchrs . "[\S]*\.[\S]*" . $strip_rchrs; //abc.de
$preg_pattern = "/(" . $prot_pat . "|" . $email_pat . "|" .
$general_pat . ")/ei";
$preg_replace = "check_preg('$1')";
return preg_replace($preg_pattern, $preg_replace, $text);
}
function check_preg($subpat) {
//These abbr. should not be linked
$exc_string = "/e\.g|i\.e|et\.c/i";
//If it says abc://de.fg
if (preg_match("/[\S]*\:\/\/[\S]*\.[\S]*/i", $subpat) == 1) {
return "<a href='" . $subpat . "'
target='_top'>" . $subpat . "</a>";
}
//If it says abc@de.fg
else if (preg_match("/[\S]*@[\S]*\.[\S]*/i", $subpat) == 1) {
return "<a href='mailto:" . $subpat .
"'>" . $subpat . "</a>";
}
//If it says "e.g." don't link
else if (preg_match($exc_string, $subpat) == 1) {
return $subpat;
}
//If it says abc.de
else
return "<a href='http://" . $subpat .
"' target='_top'>" . $subpat . "</a>";
}
?>
----
Server IP: 69.147.83.197
Probable Submitter: 130.243.210.11
----
Manual Page -- http://www.php.net/manual/en/function.preg-replace.php
Edit -- https://master.php.net/note/edit/74582
Del: integrated -- https://master.php.net/note/delete/74582/integrated
Del: useless -- https://master.php.net/note/delete/74582/useless
Del: bad code -- https://master.php.net/note/delete/74582/bad+code
Del: spam -- https://master.php.net/note/delete/74582/spam
Del: non-english -- https://master.php.net/note/delete/74582/non-english
Del: in docs -- https://master.php.net/note/delete/74582/in+docs
Del: other reasons-- https://master.php.net/note/delete/74582
Reject -- https://master.php.net/note/reject/74582
Search -- https://master.php.net/manage/user-notes.php