php / regex:“linkify”博客标题

时间:2010-07-14 08:55:41

标签: php regex string slug

我正在尝试编写一个简单的PHP函数,它可以使用像

这样的字符串

Topic: Some stuff, Maybe some more, it's my stuff?

并返回

topic-some-stuff-maybe-some-more-its-my-stuff

因此:

  • 小写
  • 删除所有非字母数字非空格字符
  • 用连字符替换所有空格(或空格组)

我可以使用一个正则表达式吗?

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

为什么正则表达式被认为是解决所有生命问题的普遍灵丹妙药(仅仅因为preg_match中的低回溯已经发现了治愈癌症的方法)。这是一个无需借助regexp的解决方案:

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

给出

  

主题的一些-东西 - 也许,一些-更其-MY-iñtërnâtiônàlizætiøn-东西

答案 2 :(得分:2)

您可以使用preg_replace

preg_replace(array("/[A-Z]/e", "/\\p{P}/", "/\\s+/"),
    array('strtolower("$0")', '', '-'), $str);

从技术上讲,你可以使用一个正则表达式,但这更简单。

抢先回应:是的,它不必要地使用正则表达式(虽然非常简单),对strtolower的调用次数非常大,并且它不考虑非英语字符(他甚至没有给出编码);我只是满足了OP的要求。

答案 3 :(得分:2)