正则表达式 - 对 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('/&([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 链接 - Python