【问题标题】:Create slug-string from a title从标题创建 slug-string
【发布时间】:2014-11-02 03:21:40
【问题描述】:

我试图去掉字符串中的一些字符。字符串将通过表单提交(方法: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);

首先,我的尝试没有如我所愿。

其次:我怎样才能使这段代码更小?我想有可能只用一个正则表达式就可以得到这个......

【问题讨论】:

  • 请解释“不起作用”
  • 我没有得到结果。
  • 没有/g 修饰符为preg_match,删除它,会正常工作。
  • 哦。很简单 :-) 谢谢。
  • Ö 不会使用 strtolower() 转换为小写

标签: php regex


【解决方案1】:

preg_match 没有 /g 修饰符。您可以使用preg_match_all,也可以直接删除它。

Here's your eval.in

相反,如果您只是想从中获得更简洁的 URL,并且您正在尝试将代码最小化为 1-liner,我们可以使用 iconvTRANSLIT 将字符集转换为最接近的我们选择的字符集,例如 UTF-8,那么您可以将其全部包装成 1 行。

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

Here's the eval.in for this example

【讨论】:

  • 是否可以优化代码?还是我必须取八单行?
【解决方案2】:

您总是可以创建一个函数来执行此操作。您可以根据自己的需要进行调整,这是一个示例。

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

Demo

【讨论】:

  • 请注意:在我看来,当您必须使用正则表达式时,您应该使用正则表达式。否则,它会使您的代码变得毫无意义地复杂。老实说,我认为这是正则表达式的用例。
猜你喜欢
  • 2015-02-12
  • 2020-05-24
  • 2012-03-19
  • 2020-08-29
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 2011-05-30
相关资源
最近更新 更多