我正在尝试编写一个简单的 PHP 函数,它可以采用类似的字符串
Topic: Some stuff, Maybe some more, it's my stuff?
并返回
topic-some-stuff-maybe-some-more-its-my-stuff
像这样:
- 小写
- 删除所有非字母数字非空格字符
- 用连字符替换所有空格(或空格组)
我可以用一个正则表达式来做到这一点吗?
function Slug($string)
{
return strtolower(trim(preg_replace('~[^0-9a-z]+~i', '-', html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8')), ENT_QUOTES, 'UTF-8')), '-'));
}
$topic = 'Iñtërnâtiônàlizætiøn';
echo Slug($topic); // internationalizaetion
$topic = 'Topic: Some stuff, Maybe some more, it\'s my stuff?';
echo Slug($topic); // topic-some-stuff-maybe-some-more-it-s-my-stuff
$topic = 'here عربي Arabi';
echo Slug($topic); // here-arabi
$topic = 'here 日本語 Japanese';
echo Slug($topic); // here-japanese
为什么正则表达式被认为是解决所有生活问题的万能灵丹妙药(只是因为 preg_match 中的低回溯发现了治愈癌症的方法)。这是一个无需使用正则表达式的解决方案:
$str = "Topic: Some stuff, Maybe some more, it's my stuff?";
$str = implode('-',str_word_count(strtolower($str),2));
echo $str;
不走整个 UTF-8 路线:
$str = "Topic: Some stuff, Maybe some more, it's my Iñtërnâtiônàlizætiøn stuff?";
$str = implode('-',str_word_count(strtolower(str_replace("'","",$str)),2,'Þßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ'));
echo $str;
给
话题-一些-东西-也许-更多-它-我的-iñtërnâtiônàlizætiøn-东西
你可以用一个来做到这一点preg_replace
:
preg_replace(array("/[A-Z]/e", "/\\p{P}/", "/\\s+/"),
array('strtolower("$0")', '', '-'), $str);
从技术上讲,您可以使用一个正则表达式来完成,但这更简单。
抢先响应:是的,它不必要地使用正则表达式(尽管非常简单),不必要的大量调用strtolower
,并且它不考虑非英语字符(他甚至没有给出编码);我只是满足OP的要求。
许多框架为此提供了功能
CodeIgniter: http ://bitbucket.org/ellislab/codeigniter/src/c39315f13a76/system/helpers/url_helper.php#cl-472
wordpress(代码中有更多): http ://core.trac.wordpress.org/browser/trunk/wp-includes/formatting.php#L814