1

我在 StackOverflow 网站上注意到的一些事情:

如果您访问 StackOverflow.com 上问题的 URL:

“https://stackoverflow.com/questions/10721603”

该网站将问题的名称添加到 URL 的末尾,因此变为:

“https://stackoverflow.com/questions/10721603/grid-background-image-using-imagebrush”

太好了,我知道这会使 URL 更有意义,并且可能是一种很好的 SEO 技术。

在 StackOverflow 上看到这个实现后我想要实现的目标

我希望在我的网站上实现同样的功能。我很高兴使用header()301 重定向来实现这一点,但我正在尝试提出一个可以解决问题的紧凑脚本。

到目前为止我的代码

请点击这里查看它的工作原理

// Set the title of the page article (This could be from the database).  Trimming any spaces either side
$original_name = trim(' How to get file creation & modification date/times in Python with-dash?');

// Replace any characters that are not A-Za-z0-9 or a dash with a space
$replace_strange_characters = preg_replace('/[^\da-z-]/i', " ", $original_name);

// Replace any spaces (or multiple spaces) with a single dash to make it URL friendly
$replace_spaces = preg_replace("/([ ]{1,})/", "-", $replace_strange_characters);

// Remove any trailing slashes
$removed_dashes = preg_replace("/^([\-]{0,})|([\-]{2,})|([\-]{0,})$/", "", $replace_spaces);

// Show the finished name on the screen
print_r($removed_dashes);

问题

我已经创建了这段代码,从外观上看它运行良好,它使字符串 URL 对人眼友好且可读。但是,我想看看是否有可能简化或“收紧”一点......因为我觉得我的代码可能过于复杂。

我并不希望它放在一行上,因为我可以通过将函数相互嵌套来做到这一点,但我觉得可能有一种整体上更简单的方法来实现它——我正在寻找想法。

综上所述,代码实现了以下几点:

  • 删除任何“奇怪”字符并用空格替换它们
  • 用破折号替换任何空格以使其对 URL 友好
  • 返回一个没有任何空格的字符串,单词用破折号分隔,并且没有尾随空格或破折号
  • 字符串可读(不包含百分号和 + 符号,例如简单地使用urlencode()

谢谢你的帮助!

潜在的解决方案

我在写这篇文章时发现,我正在寻找所谓的 URL 'slug',它们确实对 SEO 有用。

我在 Google 代码上发现了这个库,似乎在第一个实例中运行良好

在 SO 上还有一个值得注意的问题,可以在此处找到,其中还有其他示例。

4

2 回答 2

1

我试着像你一样玩 preg。但是,当您开始研究外语时,它会变得越来越复杂。我最终做的只是修剪标题,并使用 urlencode

$url_slug = urlencode($title);

我还必须添加这些:

$title = str_replace('/','',$title); //Apache doesn't like this character even encoded
$title = str_replace('\\','',$title); //Apache doesn't like this character even encoded

还有第 3 方库,例如:http ://cubiq.org/the-perfect-php-clean-url-generator

于 2013-10-30T15:34:09.403 回答
0

事实上,你可以这样做:

$original_name = ' How to get file creation & modification date/times in Python with-dash?';

$result = preg_replace('~[^a-z0-9]++~i', '-', $original_name);
$result = trim($result, '-');

要处理其他字母,您可以改用此模式:

~\P{Xan}++~u

或者

~[^\pL\pN]++~u
于 2013-10-30T15:56:08.907 回答