2010-11-17 115 views
1

我想创建一个slu so,所以我想去掉每一个奇怪的charachter。 slu should只能包含小写字母和下划线。有没有办法检查奇怪的charachters并将其过滤出字符串?一切,是不是charachter或下划线应删除去掉字符串中所有奇怪的字符串

这是我有:

if(!preg_match_all('/[a-z]/')): 
    $output = preg_replace("/ ... euhm ... /", "", $slug2); 
else: 
    $output = $slug2; 
endif; 

我应该从这样的:(!再加上免费的PSD)创建一个3D带状卷绕的影响

这样的:create_a_3d_ribbon_wrap_around_effect_plus_a_free_psd

+0

有时候更容易“删除所有字符,但这个,这个和这个”;我认为这符合你的情况。 – BeemerGuy 2010-11-17 23:02:25

+2

所以你还想要将空格转换为下划线?数字也可以吗?你的例子和你的描述不匹配。 – cdhowie 2010-11-17 23:02:41

+0

而你想要'strtolower()'。 – AndreKR 2010-11-17 23:03:32

回答

3
$slug = strtolower($slug); 
$slug = str_replace(" ", "_", $slug); 
$slug = preg_replace("/[^a-z0-9_]/", "", $slug); 
+0

恐怕除了那些古色古香的1960年代* a-z *之外,你已经忘记了一千八百八十二个小写字母。 ''unichars -a'\ p {Lower}''[^ a-z]'| wc -l' == 1882' – tchrist 2010-11-17 23:43:23

+0

根据OP的例子,这看起来像它将被用于URL中的slu gs。 Unicode字符在URL中看起来很丑,所以我怀疑OP是否想保留它们。 – cdhowie 2010-11-17 23:45:24

+0

同意。但有趣的是,拉丁文,西里尔文和希腊文不止这些。 ;) – AndreKR 2010-11-17 23:55:59

0
$slug = preg_replace("[^a-z_]", "", $slug); 
+0

你忘了近两千个小写字母。 – tchrist 2010-11-17 23:44:43

1

不需要进行初始匹配。你可以做一个无条件的搜索和替换。如果没有东西可以替代,没有什么大不了的。这是作为一个功能的大型连锁调用:

$slug = trim(preg_replace('/[\W_]+/', '_', strtolower($slug)), '_'); 

或分割成单独行:

$slug = strlower($slug); 
$slug = preg_replace('/[\W_]+/', '_', $slug); 
$slug = trim($slug, '_'); 

说明:

  1. 转换大写与小写strtolower
  2. 搜索\W_。 “单词”字符是字母,数字或下划线。 “非单词”字符与此相反,即空格,标点符号和控制字符。 \W匹配“非单词”字符。
  3. 用下划线替换那些不好的字符。如果连续有多个,他们将被一个下划线替换。
  4. 从字符串的开始和结尾修剪下划线。

代码的在复杂一边,因为还有需要处理一些棘手的案件:

  • 在两端坏字符需要被删除,不会转换为下划线。例如,您示例中的!)
  • 我们希望foo_-_bar变成foo_bar而不是foo___bar。基本上,下划线应该被折叠。