我需要PHP中的一些帮助来创建简短的URL,就像StackOverflow在我们在一个问题的评论中评论任何长URL时创建的那样。
StackOverflow将http://www.noupe.com/how-tos/10-ways-to-automatically-manually-backup-mysql-database.html
个长网址缩短为这样的短网址noupe.com/...
我的应用程序中需要类似的功能。任何人都可以在PHP中提供一些想法或代码如何做到这一点?
我厌倦了在StackOverflow上搜索但没有发现任何问题。我记得我在SO上看过这样的问题,但现在我无法找到它:(
请帮忙!
答案 0 :(得分:7)
简单算法的概述。
http://
删除开头的https://
或str_replace
。/
处爆炸,只保留返回数组中的第一项。/...
。www.
开头删除str_replace
。使用此找到的字符串,将其命名为[shortURL]
,您可以构建锚点:
<a href="[fullURL]">[shortURL]</a>
答案 1 :(得分:2)
我的猜测是你只需在源输出中搜索<a>
标签,并相应地更改它的值。 href
保持不变,但您将链接名称更改为您想要的名称。
但这只是一个想法......你总是可以尝试新的东西。
还应该有一种方法可以使用javascript随时随地完成此操作。
开箱即用!
答案 2 :(得分:1)
这是一个用链接替换URL的功能。您只需要调整格式化方式即可。也许使用parse_url()
<?php
function URLref($sentence){
$temp = explode(" ", $sentence);
$new = "";
foreach($temp as $i){
if(preg_match('([A-Za-z][A-Za-z0-9+.-]{1,120}:[A-Za-z0-9/](([A-Za-z0-9$_.+!*,;/?:@&~=-])|%[A-Fa-f0-9]{2}){1,333}(#([a-zA-Z0-9][a-zA-Z0-9$_.+!*,;/?:@&~=%-]{0,1000}))?)', $i)){
$new .= '<a href="'.$i.'">'.$i.'</a>';
}else{
$new .= "$i ";
}
}
return trim($new);
}
$sentence = "My site ULR is http://www.google.com/lolz.html";
echo URLref($sentence);
答案 3 :(得分:1)
您可以使用正则表达式检索网址,此处有两个示例,说明如何根据找到的网址创建<a>
代码以及如何缩短<a>
代码的内容:
<?php
$orig_text = <<<TEXT
This is some text. http://www.example.com/this-is-a-quite-long-url-to-be-shortened.html
http://www.example.com/another-url-to-be-shortened and http://www.example.com/another-one-that-is-longer-than-limit then
http://www.example.com/an-ok-url and some text to finish the sentence.
Now, try with an HTTPS url: https://www.example.com/this-https-url-is-too-long.
And with an already-created tag <a href='http://www2.example.com/this-is-another-long-url.html'>http://www2.example.com/this-is-another-long-url.html</a> <a href='http://www2.example.com/my-test-url-goes-here.html'>And this is just some long long link description to be shortened</a>. More text here.
TEXT;
$PATTERN_URL='#(?:href=[\'"]?)?!(https?://([^/]+)/([^\s]+))\b#';
define('URL_LENGTH_LIMIT', 36);
function create_a_tag($matches) {
$url = $matches[1];
$label = $matches[1];
if (strlen($label) > URL_LENGTH_LIMIT) $label = $matches[2] . '/...';
return "<a href='$url'>$label</a>";
}
function shorten_url_or_text($url) {
if (strlen($url) > URL_LENGTH_LIMIT) {
$matches = array();
if (preg_match('#^(https?://[^/]*).*#', $url, $matches)) {
// Shorten as for URLS
return $matches[1] . '/...';
}
else {
// Trim to a given length
return substr($url, 0, URL_LENGTH_LIMIT-3) . '...';
}
}
else {
return $url;
}
}
function shorten_a_text($matches) {
$text = shorten_url_or_text($matches[2]);
return $matches[1] . $text . $matches[3];
}
// This will replace urls with their shortened form
echo "----- CREATE <A> TAGS -----\n";
$text2 = preg_replace_callback($PATTERN_URL, 'create_a_tag', $orig_text);
echo $text2 . "\n";
// This will shorten content inside <a> tags
echo "----- CREATE <A> TAGS -----\n";
$text3 = preg_replace_callback('@(<a[^>]*>)([^<]*)(</a>)@i', 'shorten_a_text', $text2);
echo $text3;
echo "\n";
答案 4 :(得分:-3)
要创建没有匹配文件的“自定义”网址,您必须配置您的网络服务器。如果您正在使用Apache并且有权这样做,那么您可以查看mod_rewrite
:http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html
教程: http://articles.sitepoint.com/article/guide-url-rewriting