PHP正则表达式脚本删除任何不是字母或数字0到9的内容,并将空格替换为连字符 - 更改为小写,确保只有一个连字符 - 单词之间没有 - 或---等。
例如:
示例:快速的棕色狐狸跳了起来 结果:快速的棕色狐狸跳跃
示例:快速的棕色狐狸跳了! 结果:快速的棕色狐狸跳跃
示例:快速的棕色狐狸 - 跳了! 结果:快速的棕色狐狸跳跃
示例:快〜!@#$%^& *()_ + = ------- brown {} |] [:“';<>?。,/ fox - 跳了! 结果:快速的棕色狐狸跳跃
示例:快速1234567890~`!@#$%^& *()_ + = ------- brown {} |] [:“';<>?。,/ fox - 跳了! 结果:快速 - 1234567890-棕色 - 狐狸跳跃
有人知道正则表达式吗?
谢谢!
答案 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);