0

我想为我的数据库站点创建干净的 URL,并且我决定最好的方法是创建一个字段来存储它们各自条目的 URL。

我正在使用 GenerateUrl 函数(在此处找到)从源名称创建一个干净的 URL:-

function GenerateUrl ($s) {

    // Convert accented characters, and remove parentheses and apostrophes
    $from = explode (',', "ç,æ,œ,á,é,í,ó,ú,à,è,ì,ò,ù,ä,ë,ï,ö,ü,ÿ,â,ê,î,ô,û,å,e,i,ø,u,(,),[,],'");
    $to   = explode (',', 'c,ae,oe,a,e,i,o,u,a,e,i,o,u,a,e,i,o,u,y,a,e,i,o,u,a,e,i,o,u,,,,,,');

    // Do the replacements, and convert all other non-alphanumeric characters to spaces
    $s = preg_replace ('~[^\w\d]+~', '-', str_replace ($from, $to, trim ($s)));

    // Remove a - at the beginning or end and make lowercase
    return strtolower (preg_replace ('/^-/', '', preg_replace ('/-$/', '', $s)));
}

尽管我在使用撇号时遇到了问题,但它在大多数情况下都很好用。

用作引号(即仅触及一侧的另一个字符)它们可以正常工作:- 'Eiffel Tower (Paris)' 成为 URL:eiffel-tower-paris

但用作实际的撇号(即夹在两个字符之间),不太好:- 圣保罗大教堂(伦敦)成为 URL:st-paul-s-cathedral-london

我正在使用 PHP 5.4.3 并且有代码来撤消对魔术引号的修改(这应该是问题的原因)。

非常感谢任何有关解决此问题的建议。

谢谢,

安迪


是的,所需的 URL 是:st-pauls-cathedral-london

我刚刚弄清楚了我给 DOES 工作的原始函数代码(撇号分别在 $from 和 $to 行的末尾被替换为空)。

但是,它似乎只有在我将函数应用于页面上的名称时才有效,即

<?php echo generateurl($attraction['attraction_name']); ?>

但是我目前正在做的是在将数据输入网站时应用 index.php 文件中的函数。我怀疑问题出在我将函数应用于已经应用了以下函数的值(以处理魔术引号)的事实:-

$attraction_name = mysqli_real_escape_string($link, $_POST['attraction_name']);
$attraction_url = generateurl($attraction_name);

我认为在受到mysqli_real_escape_string 的影响之前,我必须改变一些编码以从traction_name 生成URL。我会让你知道我是怎么过的...

4

3 回答 3

3

如果st-paul-s-cathedral-london不正确,那么我假设您想要st-pauls-cathedral-london?在这种情况下,我认为最好完全删除字符串中的所有撇号。如果它在字母之间,它将被完全删除,所以paul's变成pauls,但如果有另一个字符,那么那个字符无论如何都会变成一个破折号,所以仍然不需要撇号。

我会更改最后一行,如下所示。它用空替换了',并使用更简单trim的方法来删除前导和尾随破折号。不需要正则表达式,代码更短更清晰。

return trim(str_replace("'", '', strtolower($s)), '-');
于 2012-11-21T19:15:00.267 回答
2

添加另一个正则表达式以删除撇号。

$s = str_replace ($from, $to, trim ($s));
$s = preg_replace("~'~", '', $s);
$s = preg_replace ('~[^\w\d]+~', '-', $s);
于 2012-11-21T19:16:40.617 回答
0

是的,事实证明“mysqli_real_escape_string”是问题的原因。对代码进行一些重新排序似乎已经对其进行了排序:-

$attraction_url = generateurl($_POST['attraction_name']);
$attraction_name = mysqli_real_escape_string($link, $_POST['attraction_name']);

谢谢!

安迪


如何从任何 URL 的开头删除“the”、“a”和“an”:-

将上述 GenerateUrl 函数代码的最后一行替换为:-

return strtolower (preg_replace ('/^-/', '', preg_replace ('/-$/', '', preg_replace ('/\b(^the|^a|^an)\b/i', '', $s))));

来自Stack Overflow的关于此主题的有用建议。

还有一篇关于在Regex Tutorial中使用 \b 作为正则表达式中单词边界的好文章。

于 2012-11-22T11:14:07.180 回答