缩短链接上的 URL 文本,如 ***?
Posted
技术标签:
【中文标题】缩短链接上的 URL 文本,如 ***?【英文标题】:Shorten URL text on links like ***? 【发布时间】:2010-10-19 08:23:06 【问题描述】:我需要一些 php 帮助来创建短 url,就像我们在 cmets 中对问题评论任何长 URL 时创建的 *** 一样。
*** 将 http://www.noupe.com/how-tos/10-ways-to-automatically-manually-backup-mysql-database.html
长 url 缩短为像这样的短 url noupe.com/...
我的应用程序需要类似的功能。谁能给出一些想法或代码如何在 PHP 中做到这一点?
我厌倦了在 *** 上搜索它,但没有找到任何问题。我记得我在 SO 上看到过这样的问题,但现在我找不到它:(
请帮忙!
【问题讨论】:
缩短的是<a>
标记内的文本,而不是 URL,因此您可能需要重新表述您的问题。为此,您可以使用简单的字符串操作。
没有,只有http://www.noupe.com/how-tos/10-ways-to-automatically-manually-backup-mysql-database.html
URL,我们需要缩短它。然后我们把它写成<a href="long URL">Dynamically generated Short URL</a>
【参考方案1】:
只是一个简单算法的概述。
-
查看链接长度是否超过 X 个字符。
删除以
str_replace
开头的http://
或https://
。
在/
展开,只保留返回数组中的第一项。
如果您在第 3 步发现超过 1 项,请在末尾添加 /...
。
可选。删除以str_replace
开头的www.
。
有了这个找到的字符串,将它命名为[shortURL]
,你就可以组成你的锚了:
<a href="[fullURL]">[shortURL]</a>
【讨论】:
虽然这是真的,但您未能解决必须在用户输入中找到 URI 的事实。 我认为 URL 的来源与问题无关。【参考方案2】:我的猜测是您只需要在源输出中搜索<a>
标签,并相应地更改它的值。 href
保持不变,但您将链接名称更改为您想要的名称。
但这只是一个想法......你总是可以尝试新的东西。
还应该有一种方法可以通过 javascript on-the-go 来实现这一点。
跳出框框思考!
【讨论】:
【参考方案3】:这是一个用链接替换 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);
【讨论】:
您好,我喜欢您的回答,如果我们想像 OP 所说的那样缩短网址怎么办。如果你回显 $sentence 它会给My site ULR is http://www.google.com/...
怎么办?该怎么做?
亲爱的@petah 我想我修好了,我有一个问题,如果网址没有 http 怎么办?它只有 www.google.com
你怎么能修改你的正则表达式来找到那些没有 http:// 的网址,谢谢【参考方案4】:
您可以使用正则表达式检索 URL,这里有两个示例说明如何从找到的 URL 创建 <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";
【讨论】:
看起来 *** 没有猜到正确的语法高亮。而且 heredoc 字符串没有正确着色。【参考方案5】:要创建没有匹配文件的“自定义”URL,您必须配置您的网络服务器。如果您使用的是 Apache 并且有权这样做,您可以查看mod_rewrite
:http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html
还有一个教程: http://articles.sitepoint.com/article/guide-url-rewriting
【讨论】:
您的答案不正确的原因是锚标记中显示的文本不必匹配锚标记的href属性指向的URI。也就是说,您是正确的,***.com 上的几乎所有其他 URI 肯定是使用 url 重写技术创建的,例如您发布的链接中描述的技术。 我只是做了一个错误的假设,当 Alin 发表他的评论时,我重新阅读并理解了发生的事情。不过,感谢您花时间解释您为什么投反对票 :)以上是关于缩短链接上的 URL 文本,如 ***?的主要内容,如果未能解决你的问题,请参考以下文章