首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式-任何文本到URL友好的

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

Stack Overflow用户
提问于 2010-10-29 12:35:59
回答 5查看 15.2K关注 0票数 11

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

例如:

快棕狐跳结果:快棕狐跳。

那只敏捷的棕色狐狸跳了起来!结果:快棕狐跳。

那只敏捷的棕色狐狸跳了起来!结果:快棕狐跳。

例如:@#$%^ &*()_+=

例如:快1234567890 ~!@#$%^ &*()_+=

有人对正则表达式有想法吗?

谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-10-29 12:49:09

由于您似乎希望将所有非字母数字字符序列替换为单个连字符,因此可以使用以下命令:

代码语言:javascript
复制
$str = preg_replace('/[^a-zA-Z0-9]+/', '-', $str);

但这可能导致导致或尾随连字符,可以用trim删除。

代码语言:javascript
复制
$str = trim($str, '-');

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

代码语言:javascript
复制
$str = strtolower($str);

所以,所有这些都是:

代码语言:javascript
复制
$str = strtolower($str);
$str = trim($str, '-');
$str = preg_replace('/[^a-z0-9]+/', '-', $str);

或者用紧凑型的单线衬里:

代码语言:javascript
复制
$str = strtolower(trim(preg_replace('/[^a-zA-Z0-9]+/', '-', $str), '-'));
票数 28
EN

Stack Overflow用户

发布于 2010-10-29 18:25:11

我只是在做一些类似的事情,我想出了这个小代码,它还考虑了拉丁文字符的使用。

这是示例字符串:

$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';

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

$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);

合在一起:

代码语言:javascript
复制
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;

}

测试:

代码语言:javascript
复制
$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);

结果:

代码语言:javascript
复制
el-veloz-murcielago-hindu-comia-fe-liz-cardillo-y-kiwi-la-ciguena-tocaba-el-saxofon-detras-del-palenque-de-paja

我想Gumbo的答案更适合你的问题,它是一个更短的代码,但我认为它对其他人是有用的。

干杯,阿德里亚娜

票数 19
EN

Stack Overflow用户

发布于 2013-10-01 15:46:52

在一项职能中:

代码语言:javascript
复制
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) )), '-');
}

它所做的:

代码语言:javascript
复制
// 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。见顶部的函数。

例如:

代码语言:javascript
复制
// É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

编辑:在regex末尾添加"/u“以使用UTF8

编辑:由于@LuBre,已记录了重复和引导/尾随连字符

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4051889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档