我想为我的数据库网站创建干净的网址,并且我已经决定最好的方法是创建一个字段来存储各自条目的网址。
我正在使用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。我会让你知道我是怎么过的......
答案 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表示字边界的好文章。