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

Posted

技术标签:

【中文标题】正则表达式 - 对 URL 友好的任何文本【英文标题】:Regular expression - any text to URL friendly one 【发布时间】:2011-05-02 09:37:22 【问题描述】:

php 正则表达式脚本,用于删除任何非字母或数字 0 到 9 并将空格替换为连字符 - 更改为小写,确保只有一个连字符 - 在单词 no -- 或 --- 等之间。

例如:

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

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

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

例子:快~`!@#$%^ &*()_+= ------- brown |][ :"'; ?.,/ fox - 跳了! 结果:快速棕色狐狸跳跃

例子:快 1234567890 ~`!@#$%^ &*()_+= ------- brown |][ :"'; ?.,/fox - 跳了! 结果:the-quick-1234567890-brown-fox-jumped


有人知道正则表达式吗?

谢谢!

【问题讨论】:

当连字符直接位于单词之间时(例如,“some-thing”不应转换为“something”)和其他特殊情况,您可能希望留下连字符。 【参考方案1】:
$str = preg_replace('/[^a-zA-Z0-9]/', '-', $str);

【讨论】:

【参考方案2】:

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

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

【讨论】:

我认为更好的选择是先替换空格,然后替换非空格/非字母数字。在许多情况下,非空格、非字母数字字符不应该是破折号。即:“妇女之夜”将是“妇女之夜”。我首先将空格 (/\s+/) 替换为破折号,然后将所有其他 (/[^a-zA-Z0-9]+/) 替换为空字符串。您也可以省略修剪。 编辑到上面:您需要在第二个替换中添加一个破折号:/[^a-zA-Z0-9\-]+/ 请注意,此答案不考虑任何变音符号,“St. Lücie-Pétêrès”将变为“st-l-cie-ptrs”,您可以合理地期望“st-lucie-peteres” "。 @gabssnake 你可以先音译这些字符。【参考方案3】:

我只是在使用类似的东西,我想出了这段小代码,它还考虑了拉丁字符的使用。

这是示例字符串:

$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 的答案更适合你的问题,而且它的代码更短,但我认为它对其他人有用。

干杯, 阿德里安娜

【讨论】:

完美运行!救我一命!谢谢! 5 年后它仍然像魅力一样工作。简单,简单,我喜欢。谢谢楼主! 嗨@AdrianaVillafañe,我尝试使用“Plâtrerie”,它输出“pl-trerie” @gabssnake ,很抱歉这么晚才回复。我编辑了代码以包含您的示例。将函数内的第二句更改为$friendlyURL = preg_replace('/&amp;([a-z]1,2)(?:acute|circ|lig|grave|ring|tilde|uml|cedil|caron);/i','\1',$friendlyURL);(添加|circ)后,它应该可以工作。非常感谢。【参考方案4】:

如果你在 PHP 中使用它作为文件名,Gumbo 的答案是

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

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

【讨论】:

【参考方案5】:

在函数中:

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

,考虑了重复和前导/尾随连字符

【讨论】:

我认为这是迄今为止最好的解决方案。 不错,我只需添加$str = preg_replace('/--+/', '-', $str ) 即可删除任何可能的连续空格。示例:hello-how---are-you 将转换为 hello-how-are-you 感谢@LuBre,我采纳了您的反馈

以上是关于正则表达式 - 对 URL 友好的任何文本的主要内容,如果未能解决你的问题,请参考以下文章

如何通过正则表达式检测内容中的任何 URL [重复]

正则表达式搜索+替换 href="URL"

使用正则表达式重新字符串匹配提取 URL 链接 - Python

正则表达式检查文本内容

如何使用 javascript 正则表达式替换 URL 的主机部分

Javascript 清理 URL 正则表达式