缩短链接上的 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】:

我的猜测是您只需要在源输出中搜索&lt;a&gt; 标签,并相应地更改它的值。 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 创建 &lt;a&gt; 标签以及如何缩短 &lt;a&gt; 标签的内容:

<?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 文本,如 ***?的主要内容,如果未能解决你的问题,请参考以下文章

缩短url-url短地址链接

推荐十五个新浪T.CN短网址/腾讯URL短链接的生成缩短的工具

短网址是啥意思?

网易短网址怎么生成?

如何为文章制作短域名

可生成/管理/可自定义地址的 短链接URL网站