mod_rewrite: заменить подчеркивания тире

Я раскрываю свое неловкое незнание REGEX-fu здесь, но: у меня в настоящее время есть веб-сайт, где загрузка URL-адресов статей написана как «article_name», а новые – как «имя-статьи».

Я хочу переместить все их на использование тире, так что есть регулярное выражение, которое я мог бы использовать, чтобы переписать старые URL-адреса на их новые эквиваленты?

Заранее благодарю!

Сначала вы должны добиться согласованности существующих URL-адресов. В основном, вы должны нормализовать все существующие имена, чтобы всегда использовать тире. Хорошо, ты это сделал.

Мы начинаем со следующего предположения:

URL-адрес примерно соответствует форме:

 http://example.com/articles/what-ever/really-doesnt_matter/faulty_article_name

где должны быть переписаны только URL-адреса в разделе /articles , и необходимо /faulty_article_name часть /faulty_article_name .

Значительно обновлено, что-то действительно работает

Для Apache:

 RewriteEngine On RewriteRule ^(/?articles/.*/[^/]*?)_([^/]*?_[^/]*)$ $1-$2 [N] RewriteRule ^(/?articles/.*/[^/]*?)_([^/_]*)$ $1-$2 [R=301] 

Это, как правило, вдохновлено ответом GApple.

Первый /? гарантирует, что этот код будет работать как на vhost confs, так и на файлах .htaccess . Последнее не ожидает ведущей косой черты.

Затем я добавляю articles/ часть, чтобы гарантировать, что правила применяются только для URL-адресов внутри /articles .

Затем, хотя у нас есть как минимум два символа подчеркивания в URL-адресе, мы продолжаем следовать правилам. Когда мы заканчиваем только одним оставшимся символом подчеркивания, второе правило срабатывает, заменяет его тире и выполняет постоянную переадресацию.

Уф.

Попробуй это:

 RewriteRule ^([^_]*)_([^_]*_.*) $1-$2 [N] RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,R=301] 

Первое правило заменяет одно подчеркивание за раз, пока не осталось один или меньше. Последнее правило заменяет последний нижний регистр и выполняет внешнее redirect.

Потенциальный подход к размышлению:

Я предполагаю, что ваш «старый формат» и ваш «новый формат» будут в разных каталогах для этой идеи, если они не вы, возможно, захотите рассмотреть вопрос о том, что новый формат имеет другое имя каталога.

Например:

  http://site.com/articles/2008/12/31/new_years_celebration 
  http://site.com/article/2008/12/31/new-years-celebration 

В этом случае вы можете использовать mod_rewrite для обнаружения чего-либо в «старом каталоге» и перенаправить его на « redirector.php ».

Хотя, во-вторых, ваш mod_rewrite может искать что-то вроде этого:

  RedirectRule /articles/(.*_.*) /redirector.php?article=$1 

Согласование чего-либо с _ и отправка его через перенаправитель.

Внутри redirector.php вы можете получить $_SERVER['REQUEST_URI'] и использовать такие инструменты, как preg_replace и даже запросы к базе данных, чтобы найти правильный URL-адрес для их перенаправления, а также изучить количество обращений к старым URL-адресам.

Вот способ: http://yoast.com/apache-rewrite-dash-underscore/

В основном он отделяет URL-адрес в токенах по обе стороны от подчеркивания и снова перезаписывает токены с заменой подчеркивания. Проблема в том, что он заменяет только одно подчеркивание за раз; он будет перенаправлен на более близкий, но не совсем правильный URL-адрес, который снова перенаправится на еще более близкий, но, возможно, еще не правильный URL-адрес …

Он предлагает фиксировать множественные переадресации, имея несколько условий и правил перезаписи с последующим количеством подчеркиваний и токенов, но для этого потребуется столько условий и правил, сколько у вас есть подчеркивания в самом длинном названии.

Не забудьте добавить какие-либо квалификаторы, если вы можете, однако, поскольку правило может заменить пути, которые вы не хотите изменять (например, файлы изображений), как есть.

Как mod rewrite знает, каков фактический URL-адрес? Вы можете переписать все статьи, чтобы использовать подчеркивание или тире, но mod_rewrite не mod_rewrite существует ли новое местоположение.

Например,

 / I_Like_Bees хранится как / path / i_like_bees
 / I-like-flowers хранится как / path / i-like-flowers

Вы хотите, чтобы i-like-bees переписывали i_like_bees .

  • Если вы переписываете i_like_bees подчеркивания в тире, i_like_bees не будет найден
  • если вы переписываете тире, чтобы подчеркнуть, что i-like-flowers не будут найдены

Если вы сохранили все свои статьи последовательно, вы могли бы легко сделать правило перезаписи. Вместо этого вам, вероятно, придется написать сценарий для проверки существования каталогов и перенаправить 301 на нужное место.

  • Когда это полезное приложение \ G в регулярном выражении?
  • Mongodb сопоставляют символы с акцентом в качестве основного персонажа
  • Регулярное выражение для десятичного числа
  • Что эквивалентно Regex-replace-with-function-оценке в Java 7?
  • Признавательная способность «современных» регулярных выражений
  • Регулярное выражение работает на онлайн-тестере, но не работает в java
  • Regex lookahead для 'не сопровождается' в grep
  • Совместить многострочный текст с использованием регулярного выражения
  • Возrotation перекрывающихся регулярных выражений
  • Понимание регулярного выражения в Java: split ("\ t") vs split ("\\ t") - когда они оба работают, и когда они должны использоваться
  • Регулярное выражение для изменения в случае предложения
  • Давайте будем гением компьютера.