Сократить текст URL в ссылках, таких как stackoverflow? - PullRequest
4 голосов
/ 19 октября 2010

Мне нужна помощь в PHP для создания коротких URL-адресов, аналогичных тем, которые создает StackOverflow, когда мы комментируем любые длинные URL-адреса в комментариях к вопросу.

StackOverflow сокращает http://www.noupe.com/how-tos/10-ways-to-automatically-manually-backup-mysql-database.html длинный URL-адрес до таких коротких URL-адресов, как этот noupe.com/...

Мне требуется аналогичная функциональность в моем приложении.Кто-нибудь может дать какую-нибудь идею или код, как это сделать в PHP?

Я устал искать его в StackOverflow, но не нашел ни одного вопроса.Я помню, что видел такой вопрос на SO, но сейчас я не могу его найти: (

Пожалуйста, помогите!

Ответы [ 5 ]

7 голосов
/ 19 октября 2010

Просто набросок упрощенного алгоритма.

  1. Проверьте, содержит ли ссылка более X символов.
  2. Удалите http:// или https:// в началес str_replace.
  3. Разнесите в / и сохраните только первый элемент в возвращенном массиве.
  4. Если вы нашли более 1 элемента на шаге 3, добавьте /... в конце.
  5. Необязательно.Удалите www. в начале с помощью str_replace.

С этой найденной строкой, назвав ее [shortURL], вы создаете свой якорь:

<a href="[fullURL]">[shortURL]</a>
2 голосов
/ 19 октября 2010

Полагаю, вам нужно просто найти теги <a> в исходном выводе и соответствующим образом изменить его значение. href остается прежним, но вы меняете имя ссылки на то, что вам нужно.

Но это только одна идея ... Вы всегда можете поэкспериментировать с новыми вещами.

Должен также быть способ сделать это с помощью javascript на ходу.

Думай из коробки!

1 голос
/ 19 октября 2010

Вы можете получить URL с помощью регулярных выражений, вот два примера того, как создать <a> теги из найденных URL и как сократить содержание тегов <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";
1 голос
/ 19 октября 2010

Вот функция для замены 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);
0 голосов
/ 19 октября 2010

Чтобы создать «пользовательские» URL-адреса, у которых нет подходящего файла, вам необходимо настроить свой веб-сервер. Если вы используете Apache и у вас есть на это права, вы можете взглянуть на mod_rewrite: http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html

И учебник: http://articles.sitepoint.com/article/guide-url-rewriting

...