php/regex:“;linkify";博客标题

php/regex:“;linkify";博客标题,php,regex,string,slug,Php,Regex,String,Slug,我正在尝试编写一个简单的PHP函数,它可以像 主题:一些东西,也许更多,这是我的东西? 返回 topic一些东西可能还有一些是我的东西 因此: 小写的 删除所有非字母数字非空格字符 用连字符替换所有空格(或空格组) 我能用一个正则表达式做到这一点吗?为什么正则表达式被认为是解决所有生命问题的万能灵丹妙药(仅仅因为在preg_匹配中一个较低的回溯就发现了癌症的治疗方法)。下面是一个不依赖regexp的解决方案: $str = "Topic: Some stuff, Maybe some mor

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

主题:一些东西,也许更多,这是我的东西?

返回

topic一些东西可能还有一些是我的东西

因此:

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

我能用一个正则表达式做到这一点吗?

为什么正则表达式被认为是解决所有生命问题的万能灵丹妙药(仅仅因为在preg_匹配中一个较低的回溯就发现了癌症的治疗方法)。下面是一个不依赖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;
给予

topic-some-stuff-maybe-some-more-its-my-iñtërn'tiënálizætiên-stuff


您可以使用一个
preg\u replace

preg_replace(array("/[A-Z]/e", "/\\p{P}/", "/\\s+/"),
    array('strtolower("$0")', '', '-'), $str);
从技术上讲,您可以使用一个正则表达式来完成,但这更简单


抢占式响应:是的,它不必要地使用正则表达式(虽然非常简单),但不太大的调用<代码> StrutLoe<代码>,并且不考虑非英语字符(他甚至不给出编码);我只是在满足OP的需求。

许多框架都为此提供了功能

编码点火器:

wordpress(代码中还有更多内容):

您为什么要这样做?使用三个正则表达式很容易做到这一点。是什么迫使你在一个问题上这么做的?我想是因为你对这个问题缺乏了解。我最终选择了非正则表达式,这是所有这些的副本:@SilentGhost:抱歉,我不知道“slug”这个词所以在Searching可以运行iconv以防它包含外语时,没有找到这些characters@Mark:人们喜欢正则表达式,因为能够编写使perl看起来可读的东西让人觉得很聪明@Jens除了许多这样想的人之外,请这里的人为他们编写regexpthem@Jens我认为情况并非如此。人们编写正则表达式是因为它们比所有PHP字符串函数及其参数顺序所需的内存都要少。顺便说一句,您并不是在替换单个引号:
topic一些东西可能更多一些它是我的东西
+1来真正回答我的问题,但我最终选择了非正则表达式solution@Mala好电话,虽然这两种解决方案都是可读的(很好,一旦你知道<代码> StruthWordsCudio实际上没有给出一个单词计数),马克的效率可能会更高。如果你走国际化道路,为什么不走一条路,也可以考虑阿拉伯文?“我想,但我不懂这门语言。我甚至不知道这些字符是否可以罗马化。好吧,这是一个很好的观点,但我考虑了更多的情况,因为只有少数字符是阿拉伯字符(因此它们可以被丢弃)@artifact:已经这样做了(我发布了一个过时的版本)。=)谢谢我用的是CodeIgniter,所以这很有帮助。供大家参考:
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