正则表达式 - URL友好的任何文本

时间:2010-10-29 12:35:59

标签: php regex friendly-url

PHP正则表达式脚本删除任何不是字母或数字0到9的内容,并将空格替换为连字符 - 更改为小写,确保只有一个连字符 - 单词之间没有 - 或---等。

例如:

示例:快速的棕色狐狸跳了起来 结果:快速的棕色狐狸跳跃

示例:快速的棕色狐狸跳了! 结果:快速的棕色狐狸跳跃

示例:快速的棕色狐狸 - 跳了! 结果:快速的棕色狐狸跳跃

示例:快〜!@#$%^& *()_ + = ------- brown {} |] [:“';<>?。,/ fox - 跳了! 结果:快速的棕色狐狸跳跃

示例:快速1234567890~`!@#$%^& *()_ + = ------- brown {} |] [:“';<>?。,/ fox - 跳了! 结果:快速 - 1234567890-棕色 - 狐狸跳跃


有人知道正则表达式吗?

谢谢!

5 个答案:

答案 0 :(得分:27)

由于您似乎希望所有非字母数字字符序列都被单个连字符替换,您可以使用:

$str = preg_replace('/[^a-zA-Z0-9]+/', '-', $str);

但这可能导致可以使用trim删除的前导或尾随连字符:

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

要将结果转换为小写,请使用strtolower

$str = strtolower($str);

所有在一起:

$str = strtolower($str);
$str = trim($str, '-');
$str = preg_replace('/[^a-z0-9]+/', '-', $str);

或紧凑的单行:

$str = strtolower(trim(preg_replace('/[^a-zA-Z0-9]+/', '-', $str), '-'));

答案 1 :(得分:18)

我只是在处理类似的事情,我想出了一小段代码,它还考虑使用拉丁字符。

这是示例字符串:

$str = 'El veloz murciélago hindú comía fe<!>&@#$%&!"#%&?¡?*liz cardillo y kiwi. La cigüeña ¨^;.-|°¬tocaba el saxofón detrás del palenque de paja';

首先,我将字符串转换为htmlentities,以便以后更容易使用。

$friendlyURL = htmlentities($str, ENT_COMPAT, "UTF-8", false);

然后我将拉丁字符替换为相应的ascii字符(á变为aÜ变为U,依此类推):

$friendlyURL = preg_replace('/&([a-z]{1,2})(?:acute|circ|lig|grave|ring|tilde|uml|cedil|caron);/i','\1',$friendlyURL);

然后我将字符串从html实体转换回符号,以便以后再使用。

$friendlyURL = html_entity_decode($friendlyURL,ENT_COMPAT, "UTF-8");

接下来,我将所有非字母数字字符替换为连字符。

$friendlyURL = preg_replace('/[^a-z0-9-]+/i', '-', $friendlyURL);

我删除了字符串中的额外连字符:

$friendlyURL = preg_replace('/-+/', '-', $friendlyURL);

我删除了前导和尾随连字符:

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

最后将全部转换为小写:

$friendlyURL = strtolower($friendlyURL);

所有在一起:

function friendlyUrl ($str = '') {

    $friendlyURL = htmlentities($str, ENT_COMPAT, "UTF-8", false); 
    $friendlyURL = preg_replace('/&([a-z]{1,2})(?:acute|circ|lig|grave|ring|tilde|uml|cedil|caron);/i','\1',$friendlyURL);
    $friendlyURL = html_entity_decode($friendlyURL,ENT_COMPAT, "UTF-8"); 
    $friendlyURL = preg_replace('/[^a-z0-9-]+/i', '-', $friendlyURL);
    $friendlyURL = preg_replace('/-+/', '-', $friendlyURL);
    $friendlyURL = trim($friendlyURL, '-');
    $friendlyURL = strtolower($friendlyURL);
    return $friendlyURL;

}

测试:

$str = 'El veloz murciélago hindú comía fe<!>&@#$%&!"#%&-?¡?*-liz cardillo y kiwi. La cigüeña ¨^`;.-|°¬tocaba el saxofón detrás del palenque de paja';

echo friendlyUrl($str);

结果:

el-veloz-murcielago-hindu-comia-fe-liz-cardillo-y-kiwi-la-ciguena-tocaba-el-saxofon-detras-del-palenque-de-paja

我猜Gumbo的答案更适合你的问题,而且代码更短,但我认为这对其他人有用。

干杯, 阿德里安娜

答案 2 :(得分:6)

在一个功能中:

function sanitize_text_for_urls ($str) 
{
    return trim( strtolower( preg_replace(
        array('/[^a-z0-9-\s]/ui', '/\s/', '/-+/'),
        array('', '-', '-'),
        iconv('UTF-8', 'ASCII//TRANSLIT', $str) )), '-');
}

它的作用:

// Solve accents and diacritics
$str = iconv('UTF-8', 'ASCII//TRANSLIT', $str);

// Leave only alphanumeric (respect existing hyphens)
$str = preg_replace('/[^a-z0-9-\s]/ui', '', $str);

// Turn spaces to hyphens
$str = preg_replace('/\s+/', '-', $str);

// Remove duplicate hyphens
$str = preg_replace('/-+/', '-', $str);

// Remove trailing hyphens
$str = trim($str, '-');

// Turn to lowercase
$str = strtolower($str);

注意:
您可以通过传递数组来组合多个preg_replace。请参阅顶部的功能。

例如:

// Électricité, plâtrerie    -->  electricite-platrerie
// St. Lücie-Pétêrès         -->  st-lucie-peteres
// -Façade- & gros œuvre     -->  facade-gros-oeuvre

// _-Thè quîck ~`!@#&$%^ &*()_+= ---{}|][ :"; <>?.,/ fóx - jümpëd_-
// the-quick-fox-jumped

编辑:在正则表达式的末尾添加“/ u”以使用UTF8
编辑:由于@LuBre

,占重复和前导/尾随连字符

答案 3 :(得分:1)

如果您在PHP中使用此文件名,那么Gumbo的答案就是

$str = preg_replace('/[^a-zA-Z0-9.]+/', '-', $str);
$str = trim($str, '-');
$str = strtolower($str);

为文件名添加了句号,strtolower()而不是strtolowercase()

答案 4 :(得分:0)

$str = preg_replace('/[^a-zA-Z0-9]/', '-', $str);