所以,这个文字:
https://stackoverflow.com/questions/ask
应转换为此输出:
<a HREF="https://stackoverflow.com/questions/ask">stackoverflow.com/quest...</a>
对于问题1,我有这个解决方案:
$linktext = preg_replace("/([\w]+\:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/", "<a href=\"$1\">$1</a>", $linktext);
...但是不可能将此变量更改为问题2和3。
有任何想法如何修复此问题以进行一次替换操作(使用数组或其他内容)?
答案 0 :(得分:1)
我认为你将无法找到一个正则表达式来解决这个问题。但是,您可以使用常规PHP,这就是我在答案中要做的事情。
$linktext = 'https://stackoverflow.com/questions/ask';
$linktrimmed = str_replace(['https://', 'http://', 'www.'], '', $linktext); // Remove `https://`, `http://` or `www.`
$linktrimmed = ((strlen($linktrimmed) > 20) ? substr($linktrimmed, 0, 20) . '...' : $linktrimmed); // Shorten to 20 characters and add ellipsis (if neccessary). From https://stackoverflow.com/a/11434149/3088508
$linktext = "<a href=\"$linktext\">$linktrimmed</a>";
echo $linktext;
返回:
<a href="https://stackoverflow.com/questions/ask">stackoverflow.com/qu...</a>
基本上它所做的就是:
str_replace
https://
,http://
或www.
空字符串''
substr
加上省略号...
(借用此SO post借用的代码)<a>
标记。答案 1 :(得分:1)
1,创建以下功能:
function string_begins_with($string, $search) {
return (strncmp($string, $search, strlen($search)) == 0) ;
}
然后按如下方式使用此功能:
$linktext = "https://www.stackoverflow.com/questions/ask" ;
$trimmedText = $linktext ;
if (string_begins_with($trimmedText, "https://")) { //Removes https://
$trimmedText = substr($trimmedText, 8) ;
}
if (string_begins_with($trimmedText, "http://")) { //Removes http://
$trimmedText = substr($trimmedText, 7) ;
}
if (string_begins_with($trimmedText, "www.")) { //Removes www.
$trimmedText = substr($trimmedText, 4) ;
}
if (strlen($trimmedText) > 20) { //Trim the text to 20 characters
$trimmedText = substr($trimmedText, 0, 20) . "..." ;
}
echo "<a href='$linktext'>$trimmedText</a>" ;
答案 2 :(得分:1)
(正如@bassxzero建议的那样)在评论中
这极大地简化了提取主机名和路径的过程,只需要一次substr
操作即可完成满足您的要求。
function getShortUrl($url) {
$cleanedUrl = parse_url($url, PHP_URL_HOST) . parse_url($url, PHP_URL_PATH);
$shortUrl = substr($cleanedUrl, 0, 20);
if ($shortUrl !== $cleanedUrl) {
// it's been truncated, add ellipsis
$shortUrl .= "...";
}
return $shortUrl;
}
$linktext = 'https://example.com/test?abc=123';
echo "<a href='$linktext'>". getShortUrl($linktext) ."</a>";
答案 3 :(得分:1)
您需要preg_replace_callback()
和parse_url()
。基本上,找到匹配,然后解析网址,摆脱计划,删除www。 (我假设您需要保留子域名,如果它不是www),如果超过20,则减去剩余的字符(并添加句点):
<?php
$url = "this is the link: https://stackoverflow.com/questions/ask";
$linktext = preg_replace_callback("/([\w]+\:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/", function ($m) {
$url = $m[0];
$parts = parse_url($url);
$parts["host"] = str_replace("www.", "", $parts["host"]);
array_shift($parts); // remove the scheme
$shortURL = implode("", $parts);
$shortenedURL = substr($shortURL, 0, 20);
if (strlen($shortURL) > 20) $shortenedURL .= "...";
return "<a href=\"".$url."\">".$shortenedURL."</a>";
var_dump($parts);
}, $url);
echo $linktext;