代码之家  ›  专栏  ›  技术社区  ›  Keith Williams

修改:用破折号替换下划线

  •  19
  • Keith Williams  · 技术社区  · 15 年前

    我在这里揭露了我对regex fu的无知,但是:我现在有一个网站,上面有很多文章的URL写为“文章名称”,而新的则写为“文章名称”。

    我想将它们全部移动到使用破折号的位置,那么是否有一个正则表达式可以用来将旧的URL重写为新的等价物?

    提前感谢你!

    5 回复  |  直到 14 年前
        1
  •  22
  •   kch    15 年前

    首先,您必须在现有的URL中实现一致性。基本上,您必须规范化所有现有名称,以始终使用破折号。好吧,你做到了。

    我们从以下假设开始:

    URL的大致形式如下:

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

    其中只有URL位于 /articles 应该重写,只有 /faulty_article_name 零件需要消毒。

    非常更新,有一些实际工作的东西

    对于Apache:

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

    这通常是受到盖普回答的启发。

    第一个 /? 确保此代码将在vhost conf和 .htaccess 文件夹。后者不希望出现前导斜线。

    然后我添加 articles/ 部分以确保规则仅适用于 /文章 .

    然后,虽然在URL中至少有两个下划线,但我们仍然在规则中循环。当我们最后只剩下一个下划线时,第二个规则开始,用破折号替换它,并执行永久重定向。

    呸。

        2
  •  13
  •   Gumbo    15 年前

    试试这个:

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

    第一个规则一次替换一个下划线,直到只剩下一个或更少的下划线。最后一个规则将替换最后一个欠crore并执行外部重定向。

        3
  •  2
  •   Brad Gilbert    15 年前

    一种可能不同的思考方法:

    我假设您的“旧格式”和“新格式”对于这个想法将在不同的目录中,如果它们不是,您可能会考虑使新格式具有不同的目录名。

    例如:

    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的命中数。

        4
  •  1
  •   gapple    15 年前

    方法如下: http://yoast.com/apache-rewrite-dash-underscore/

    基本上,它将URL分隔为下划线两侧的标记,并用替换的下划线再次重写标记。问题是,它一次只替换一个下划线;它将重定向到一个更接近但不完全正确的URL,这将再次重定向到一个更接近但可能仍然不正确的URL…

    它建议通过具有多个重写条件和规则以及连续更多的下划线和标记来修复多个重定向,但这需要与最长标题中的下划线一样多的条件和规则。

    但是,如果可以,请确保添加任何限定符,因为规则可能会替换不希望更改的路径(如图像文件)。

        5
  •  1
  •   Brad Gilbert    15 年前

    mod rewrite如何知道实际的url应该是什么?您可以重写所有文章以使用下划线或破折号,但没有办法 mod_rewrite 来判断新位置是否存在。

    例如,

    /I_Like_Bees      is stored as   /path/i_like_bees
    /I-like-flowers   is stored as   /path/i-like-flowers
    

    你想要 i-like-bees 重写为 i_like_bees .

    • 如果将下划线重写为短划线, 蜜蜂似的蜜蜂 找不到
    • 如果将破折号改写为下划线 i-like-flowers 找不到

    如果您一致地存储了所有文章,您可以轻松地使重写规则生效。相反,您可能需要编写一个脚本来检查目录是否存在,并执行301重定向到正确的位置。