从标题创建slug-string

时间:2014-09-08 19:58:54

标签: php regex

我试图摆脱字符串中的一些字符。该字符串将由表单(方法:POST)提交。 我需要一个小写字符串。角色ä,ö,ü和ß应该成为ae,oe,ue和ss。应删除所有其他特殊字符和空格。

字符串

Lorem_ipsum_Ö-ß    &änyOther char

应该成为

lorem-ipsum-oe-ss-aenyother-char

这是我的代码:

$slug = strtolower($_POST['title']);
$slug = trim($slug, '-');
$slug = preg_replace('/ä/g', 'ae', $slug);
$slug = preg_replace('/ö/g', 'oe', $slug);
$slug = preg_replace('/ü/g', 'üe', $slug);
$slug = preg_replace('/ß/g', 'ss', $slug);
$slug = preg_replace('/[^\w ]/g', '', $slug);
$slug = preg_replace('/ +/g', '-', $slug);

首先,我的尝试不能按照我的意愿行事。

第二:如何让这段代码更小?我想有可能只用一个正则表达式...

2 个答案:

答案 0 :(得分:1)

/g没有preg_match修饰符。您可以使用preg_match_all,也可以将其删除。

Here's your eval.in

相反,如果您只是想要制作更清晰的网址并且您尝试将代码最小化为1-liner,我们可以使用iconv TRANSLIT将字符集转换为我们选择的最接近的字符集,例如UTF-8,然后你可以把它全部包装成1个衬里。

$slug = strtolower(urlencode(preg_replace('/[\s\-]/', '', iconv('utf-8', 'ascii//TRANSLIT',$str))));

Here's the eval.in for this example

答案 1 :(得分:1)

您始终可以创建一个功能来执行此操作。你可以根据自己的需要调整它,这是一个例子。

function _replace($t) {
   $map = array( 'Ä' => 'ae', 'ä' => 'ae', 'ß' => 'ss', 'Ö' => 'oe', 
                 'ö' => 'oe', 'Ü' => 'ue', 'ü' => 'ue' );
   $slug = strtr(strtolower(trim($t)), $map);
   return preg_replace('~[\W_]+~', '-', $slug);
}

Demo