Как я могу создать URL-адрес с дружественным поисковым типом строки из строки?
Возьмите строку, например:
В С#: Как добавить "Котировки" вокруг строки в списке строк с разделителями-запятыми?
и преобразуйте его в:
in-c-how-do-i-add-quotes-around-string-in-a-comma-delimited-list-of-strings
Требования:
- Отделите каждое слово тире и удалите все знаки препинания (учитывая, что не все слова разделены пробелами.)
- Функция принимает максимальную длину и получает все маркеры ниже этой максимальной длины. Пример:
ToSeoFriendly("hello world hello world", 14)
возвращает "hello-world"
- Все слова преобразуются в нижний регистр.
В отдельном примечании должна быть минимальная длина?
Ответы
Ответ 1
Вот мое решение в С#
private string ToSeoFriendly(string title, int maxLength) {
var match = Regex.Match(title.ToLower(), "[\\w]+");
StringBuilder result = new StringBuilder("");
bool maxLengthHit = false;
while (match.Success && !maxLengthHit) {
if (result.Length + match.Value.Length <= maxLength) {
result.Append(match.Value + "-");
} else {
maxLengthHit = true;
// Handle a situation where there is only one word and it is greater than the max length.
if (result.Length == 0) result.Append(match.Value.Substring(0, maxLength));
}
match = match.NextMatch();
}
// Remove trailing '-'
if (result[result.Length - 1] == '-') result.Remove(result.Length - 1, 1);
return result.ToString();
}
Ответ 2
Я бы выполнил следующие шаги:
- преобразовать строку в нижний регистр
- заменить ненужные символы дефисом
-
заменить несколько дефисов на один дефис (необязательно, поскольку вызов функции preg_replace()
уже предотвращает множественные дефисы)
- удалите hypens в начале и конце при необходимости
- обрезать, если необходимо, с последнего дефиса до положения x до конца
Итак, все вместе в функции (PHP):
function generateUrlSlug($string, $maxlen=0)
{
$string = trim(preg_replace('/[^a-z0-9]+/', '-', strtolower($string)), '-');
if ($maxlen && strlen($string) > $maxlen) {
$string = substr($string, 0, $maxlen);
$pos = strrpos($string, '-');
if ($pos > 0) {
$string = substr($string, 0, $pos);
}
}
return $string;
}
Ответ 3
С#
public string toFriendly(string subject)
{
subject = subject.Trim().ToLower();
subject = Regex.Replace(subject, @"\s+", "-");
subject = Regex.Replace(subject, @"[^A-Za-z0-9_-]", "");
return subject;
}
Ответ 4
Здесь решение для php:
function make_uri($input, $max_length) {
if (function_exists('iconv')) {
$input = @iconv('UTF-8', 'ASCII//TRANSLIT', $input);
}
$lower = strtolower($input);
$without_special = preg_replace_all('/[^a-z0-9 ]/', '', $input);
$tokens = preg_split('/ +/', $without_special);
$result = '';
for ($tokens as $token) {
if (strlen($result.'-'.$token) > $max_length+1) {
break;
}
$result .= '-'.$token;
}
return substr($result, 1);
}
использование:
echo make_uri('In C#: How do I add "Quotes" around string in a ...', 500);
Если вам не нужно, чтобы uris был типичным, они не должны быть маленькими. Но вы должны указать максимум, чтобы URL-адреса хорошо работали с прокси-серверами и т.д.
Ответ 5
Лучшая версия:
function Slugify($string)
{
return strtolower(trim(preg_replace(array('~[^0-9a-z]~i', '~-+~'), '-', $string), '-'));
}
Ответ 6
Решение в Perl:
my $input = 'In C#: How do I add "Quotes" around string in a comma delimited list of strings?';
my $length = 20;
$input =~ s/[^a-z0-9]+/-/gi;
$input =~ s/^(.{1,$length}).*/\L$1/;
print "$input\n";
сделано.
Ответ 7
Решение в оболочке:
echo 'In C#: How do I add "Quotes" around string in a comma delimited list of strings?' | \
tr A-Z a-z | \
sed 's/[^a-z0-9]\+/-/g;s/^\(.\{1,20\}\).*/\1/'
Ответ 8
Это близко к тому, как Qaru генерирует пули:
public static string GenerateSlug(string title)
{
string slug = title.ToLower();
if (slug.Length > 81)
slug = slug.Substring(0, 81);
slug = Regex.Replace(slug, @"[^a-z0-9\-_\./\\ ]+", "");
slug = Regex.Replace(slug, @"[^a-z0-9]+", "-");
if (slug[slug.Length - 1] == '-')
slug = slug.Remove(slug.Length - 1, 1);
return slug;
}
Ответ 9
Несколько более легкий способ сделать это в PHP по крайней мере:
function CleanForUrl($urlPart, $maxLength = null) {
$url = strtolower(preg_replace(array('/[^a-z0-9\- ]/i', '/[ \-]+/'), array('', '-'), trim($urlPart)));
if ($maxLength) $url = substr($url, 0, $maxLength);
return $url;
}
Можно также сделать trim()
в начале, чтобы потом было меньше обработки, и полная замена выполняется с помощью preg_replace()
.
спасибоs to cg для получения большинства из этого: Каков наилучший способ очистки строки для размещения в URL-адресе, например, имя вопроса на SO?
Ответ 10
В динамическом URL эти идентификаторы передаются через строку запроса в script, которые... в качестве разделительного символа, потому что большинство поисковых систем рассматривают тире как... NET: Руководство разработчика по SEO также охватывает эти три дополнительных метода
поисковая оптимизация
Ответ 11
Еще один сезон, другая причина, для выбора Ruby:)
def seo_friendly(str)
str.strip.downcase.gsub /\W+/, '-'
end
Что все.
Ответ 12
В python (если django установлен, даже если вы используете другую фреймворк.)
from django.template.defaultfilters import slugify
slugify("In C#: How do I add "Quotes" around string in a comma delimited list of strings?")