PHP函数生成干净的URL - 撇号

时间:2012-11-21 19:04:49

标签: php clean-urls apostrophe

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

我正在使用GenerateUrl函数(找到here)从源名称创建一个干净的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

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

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

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

谢谢,

安迪


是的,所需的网址为:st-pauls-cathedral-london

我刚刚想出了我给DOES工作的原始功能代码(撇号在$ from和$ to row的末尾分别替换为什么)。

但是,如果我将该功能应用于页面上的名称,即

,它似乎只有作用
<?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影响之前,我必须改变一些编码来生成来自attraction_name的URL。我会让你知道我是怎么过的......

3 个答案:

答案 0 :(得分:3)

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

我会改变最后一行,如下所示。它无需替换',并使用更简单的trim删除前导和尾随短划线。不需要正则表达式,代码更短更清晰。

return trim(str_replace("'", '', strtolower($s)), '-');

答案 1 :(得分:2)

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

$s = str_replace ($from, $to, trim ($s));
$s = preg_replace("~'~", '', $s);
$s = preg_replace ('~[^\w\d]+~', '-', $s);

答案 2 :(得分:0)

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

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

谢谢!

安迪


如何从任何网址的开头删除'the','a'和'an': -

将上述GenerateUrl功能代码的底行替换为: -

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

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

关于在Regex Tutorial的正则表达式中使用\ b表示字边界的好文章。