晚上好..我能够成功地将网址文本更改为链接,但是在显示没有网址的文字时遇到问题..它只是没有显示,因为它没有网址它...
尝试过并试过。请帮帮我。谢谢
<?php
$textorigen = $row_get_tweets['tweet'];
// URL starting with http://
$reg_exUrl = "/(^|\A|\s)((http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,4} (\/\S*)?)/";
if(preg_match($reg_exUrl, $textorigen, $url)) {
// make the urls hyper links
$text_result=preg_replace( $reg_exUrl, "$1<a href=\"$2\">$2</a> ", $textorigen );
$textorigen=$text_result;
} else {
// if no urls in the text just return the text
$text_result=$textorigen;
}
// URL starting www.
$reg_exUrl = "/(^|\A|\s)((www\.)[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,4}(\/\S*)?)/";
if(preg_match($reg_exUrl, $text_result, $url)) {
// make the urls hyper links
$text_result=preg_replace( $reg_exUrl, "$1<a href=\"http://$2\">$2</a>", $text_result );
$textorigen=$text_result;
echo $textorigen;
}
?>
答案 0 :(得分:1)
在使用preg_match
之前,无需使用preg_replace
进行测试。 preg_replace
仅在匹配时才会替换。
因此,您的if-then-else
结构可以简化为:
$replaced = preg_replace($regex,$replacement,$original);
答案 1 :(得分:0)
关于正则表达式模式:很难找到有效描述网址的最佳模式(准确性和性能之间的折衷)。这就是为什么一种方法使用URL的基本描述来做到这一点的原因。
关于代码:您可以更有效地使用preg_replace_callback
解析字符串一次,例如:
$textorigen = <<<'DATA'
abcd http://example.com efgh (ftps://example2.com/) ijkl www.example3.com
DATA;
$pattern = '~(?<=^|\s|\pP)(?:(ht|f)tps?://|www\.)\S+(?<![^\PP?/])(?=\s|$|\pP)~i';
$textorigen = preg_replace_callback($pattern, function ($m) {
$link = ($m[1])? $m[0] : 'http://' . $m[0];
return '<a href="' . $link . '">' . $link . '</a>'; },
$textorigen);
echo $textorigen;
模式描述:
~ # pattern delimiter
(?<=^|\s|\pP) # lookbehind : preceded by the start of the string
# or a whitespace character or a punctuation character
(?: # non capturing group
(ht|f)tps?:// # scheme
| # OR
www\. # www.
)
\S+ # one or more non whitespace characters
(?<![^\PP?/]) # that don't end with a punctuation character
# except "?" and "/"
(?=\s|$|\pP) # followed by a whitespace, the end of the string
# or a punctuation character
~i # end delimiter, the pattern is case insensitive