在PHP中将标题转换为url兼容模式的最佳方法?

use*_*729 12 php url

http://domain.name/1-As Low As 10% Downpayment, Free Golf Membership!!!
Run Code Online (Sandbox Code Playgroud)

以上网址将报告400 bad request,

如何将这样的标题转换为用户友好的请求?

cbe*_*ski 22

您可能想要使用"slug".不是使用逐字标题作为URL,而是strtolower()用连字符替换所有非字母数字字符,然后删除重复的连字符.如果你觉得额外的功劳,你也可以删除停用词.

所以"1-低至10%首付,免费高尔夫会员!!!" 变为:

as-low-as-10-downpayment-free-gold-membership

像这样的东西:

function sluggify($url)
{
    # Prep string with some basic normalization
    $url = strtolower($url);
    $url = strip_tags($url);
    $url = stripslashes($url);
    $url = html_entity_decode($url);

    # Remove quotes (can't, etc.)
    $url = str_replace('\'', '', $url);

    # Replace non-alpha numeric with hyphens
    $match = '/[^a-z0-9]+/';
    $replace = '-';
    $url = preg_replace($match, $replace, $url);

    $url = trim($url, '-');

    return $url;
}
Run Code Online (Sandbox Code Playgroud)

你可以用更长的regexp来缩短它,但是它很简单.奖励是您可以使用相同的函数来验证查询参数,然后再在数据库上运行查询以匹配标题,这样有人就无法将愚蠢的东西粘在您的数据库中.


Joh*_*nde 8

在这里看到第一个答案URL PHP中的友好用户名?:

function Slug($string)
{
    return strtolower(trim(preg_replace('~[^0-9a-z]+~i', '-', html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8')), ENT_QUOTES, 'UTF-8')), '-'));
}

$user = 'Alix Axel';
echo Slug($user); // alix-axel

$user = 'Álix Ãxel';
echo Slug($user); // alix-axel

$user = 'Álix----_Ãxel!?!?';
echo Slug($user); // alix-axel
Run Code Online (Sandbox Code Playgroud)


Joh*_*nco 0

你可以使用该rawurlencode()功能