Что такое хорошее полное регулярное выражение или какой-то другой процесс, который бы взял название:
Как изменить заголовок, чтобы он стал частью URL-адреса, например переполнения стека?
и превратить его в
how-do-you-change-a-title-to-be-part-of-the-url-like-stack-overflow
что используется в SEO-дружественных URL-адресах при переполнении стека?
Среда разработки, которую я использую, - это Ruby on Rails , но если есть какие-то другие решения для конкретной платформы (.NET, PHP, Django ), я бы тоже хотел их увидеть.
Я уверен, что я (или другой читатель) столкнусь с той же проблемой на другой платформе в будущем.
Я использую пользовательские маршруты, и я в основном хочу знать, как изменить строку, чтобы все специальные символы были удалены, все это в нижнем регистре и все пробелы заменены.
Ответы:
Вот как мы это делаем. Обратите внимание, что, вероятно, существует больше краевых условий, чем вы думаете на первый взгляд.
Это вторая версия, развернутая для увеличения производительности в 5 раз (и да, я тестировал ее). Я решил оптимизировать его, потому что эту функцию можно вызывать сотни раз за страницу.
Чтобы увидеть предыдущую версию кода, которая была заменена (но функционально эквивалентна и в 5 раз быстрее), просмотрите историю изменений этого поста (нажмите на ссылку даты).
Кроме того,
RemapInternationalCharToAscii
исходный код метода можно найти здесь .источник
RemapInternationalCharToAscii()
функции есть meta.stackexchange.com/questions/7435/…if (prevdash) sb.Length -= 1; return sb.ToString();
вместо последнегоif
утверждения.sb.Length == maxlen break;
если знак maxLenght-1 равен «ß», который он преобразует в «ss»sb.Length == maxlene
, никогда не будет истинным, лучше вместо этого проверить(sb.Length > = maxlen)
.Вот моя версия кода Джеффа. Я сделал следующие изменения:
Преобразование регистра теперь также необязательно.
Для получения более подробной информации, модульные тесты, и объяснение того , почему Facebook «s URL схема немного умнее Переполнение стека, я получил расширенную версию этого на моем блоге .
источник
if (i == maxlen) break;
наif (sb.Length == maxlen) break;
него, чтобы, если вы передадите строку с большим количеством пробелов / недопустимых символов, вы все равно можете получить фрагмент с желаемой длиной, тогда как код в его нынешнем виде может закончиться массово обрезая его (например, рассмотрим случай, когда вы начинаете с 80 пробелов ...). Примерно 10 000 000 итераций в сравнении с кодом Джеффа показали, что скорость примерно одинакова.Вы захотите настроить собственный маршрут, чтобы указать URL-адрес контроллера, который будет его обрабатывать. Поскольку вы используете Ruby on Rails, вот введение в использование их механизма маршрутизации.
В Ruby вам понадобится регулярное выражение, как вы уже знаете, и вот регулярное выражение для использования:
источник
Вы также можете использовать эту функцию JavaScript для генерации слагов в форме (эта основана на / скопирована из Django ):
источник
Для примера, вот функция PHP в WordPress, которая делает это ... Я думаю, что WordPress является одной из наиболее популярных платформ, использующих модные ссылки.
Эта функция, а также некоторые вспомогательные функции можно найти в wp-includes / formatting.php.
источник
remove_accents
,seems_utf8
...git clone git://core.git.wordpress.org/
и найтиwp-includes/formatting.php
файл вЕсли вы используете Rails edge, вы можете положиться на Inflector.parametrize - вот пример из документации:
Также, если вам нужно обрабатывать более экзотические символы, такие как акценты (éphémère) в предыдущей версии Rails, вы можете использовать смесь PermalinkFu и DiacriticsFu :
источник
Я не знаком с Ruby on Rails, но ниже приведен (непроверенный) код PHP. Возможно, вы сможете очень быстро перевести это на Ruby on Rails, если сочтете это полезным.
Надеюсь, это поможет.
источник
Я не очень разбираюсь в Ruby или Rails, но в Perl я бы так и сделал:
Я только что сделал быстрый тест, и это похоже на работу. Надеюсь, это относительно легко перевести на Ruby.
источник
Реализация T-SQL, адаптированная из dbo.UrlEncode :
источник
Я знаю, что это очень старый вопрос, но так как большинство браузеров теперь поддерживают URL-адреса Unicode, я нашел отличное решение в XRegex, которое конвертирует все, кроме букв (во всех языках в «-»).
Это можно сделать на нескольких языках программирования.
Шаблон есть,
\\p{^L}+
и тогда вам просто нужно использовать его, чтобы заменить все не буквы на '-'.Рабочий пример в файле node.js с модулем xregex .
источник
Предполагая, что ваш класс модели имеет атрибут title, вы можете просто переопределить метод to_param внутри модели, например так:
Этот эпизод Railscast имеет все детали. Вы также можете убедиться, что заголовок содержит только допустимые символы, используя это:
источник
Код Брайана в Ruby:
downcase
превращает строку в нижний регистр,strip
удаляет начальные и конечные пробелы, первыйgsub
вызов г lobally суб stitutes пространства с тире, а второй удаляет все , что не является буквой или тире.источник
Для этого есть небольшой плагин Ruby on Rails, который называется PermalinkFu . Метод escape выполняет преобразование в строку, подходящую для URL . Посмотрите на код; этот метод довольно прост.
Для удаления не- ASCII символов он использует иконку lib для перевода в 'ascii // ignore // translit' из 'utf-8'. Затем пробелы превращаются в тире, все в нижнем регистре и т. Д.
источник
Вы можете использовать следующий вспомогательный метод. Он может конвертировать символы Unicode.
источник
Вот моя (более медленная, но забавная написание) версия кода Джеффа:
Моя тестовая строка:
" I love C#, F#, C++, and... Crème brûlée!!! They see me codin'... they hatin'... tryin' to catch me codin' dirty... "
источник
Решение stackoverflow отлично, но современный браузер (исключая IE, как обычно) теперь прекрасно обрабатывает кодировку utf8:
Поэтому я обновил предложенное решение:
Полный код на Pastebin
Изменить: вот код для
RemapInternationalCharToAscii
метода (отсутствует в pastebin).источник
Мне понравилось, как это делается без использования регулярных выражений , поэтому я перенес его на PHP. Я просто добавил функцию, вызываемую
is_between
для проверки символов:источник
Теперь все браузеры прекрасно справляются с кодировкой utf8, поэтому вы можете использовать метод WebUtility.UrlEncode , похожий на HttpUtility.UrlEncode, используемый @giamin, но он работает вне веб-приложения.
источник
Я портировал код на TypeScript. Его можно легко адаптировать к JavaScript.
Я добавляю
.contains
метод кString
прототипу, если вы ориентируетесь на новейшие браузеры или ES6, которые вы можете использовать.includes
вместо этого.источник
Нет нет нет. Вы все так сильно ошибаетесь. За исключением диакритического фу, вы попадаете туда, но как насчет азиатских персонажей (позор разработчиков Ruby за то, что они не считают своих братьев nihonjin ).
Firefox и Safari отображают не-ASCII символы в URL , и, честно говоря, они выглядят великолепно. Приятно поддерживать такие ссылки, как « http://somewhere.com/news/read/ ».
Итак, вот некоторый PHP-код, который это сделает, но я только написал и не подверг его стресс-тестированию.
Пример:
Выходы: コ リ ン -и-ト ー マ ス -и-ア ー ノ ル ド
'-And-' потому что & 's изменен на' -and- '.
источник