0

我的标题由空格、[ { } & () 大写字母和其他几个我只想替换为小写字符的未知字符组成。我正在使用它,但由于我无法预测用户将提供什么输入,因此我正在考虑某种正则表达式或 preg 替换或 preg 匹配,以便只接受带有下划线的小写字母(用于空格)或将标题转换为带有下划线的全小写.我不想要任何其他字符,例如 ,{[]}() 等。

我已经尝试过了,但更喜欢一行 preg replace 或 regex

     $name = str_replace(' ', '_', $cityu);
     $name1 = str_replace('(', '_', $name);
     $name2 = str_replace(')', '_', $name1);
4

3 回答 3

5

我认为你可以使用这样的东西:

$string = preg_replace('/[^\w]/','_', $string);
$string = strtolower($string);
于 2013-03-11T17:24:20.387 回答
0

因为preg_replace()您想使用括在方括号中的字符类[],例如:

$output = preg_replace('/[() ]/', '_', $input);

但是,如果要替换所有非字母字符,则可以使用:

$output = preg_replace('/[^a-z0-9]/', '_', $input);

字符^类内部的意思是“不是”,因此它替换不是从 a 到 z 或 0 到 9 的字符。

最后,您可以简单地使用 转换为小写strtolower(),因此您的代码如下所示:

$output = preg_replace('/[^a-z0-9]/', '_', strtolower($input));

您可能还想将多个压缩____为一个_,这可以通过以下方式完成:

$output = preg_replace('/_{2,}/', '_', $input);

where{2,}表示匹配两个或多个出现的_字符。

于 2013-03-11T17:28:03.263 回答
0

您的问题要求存在一定程度的歧义,因此我将介绍一些场景。如果您需要容纳 unicode 字符,您应该通过编辑在您的问题中阐明该细节。

代码:(演示

$string = "(Here {is [a] Special} Title)! & it's fine, right?";

// all non-letters become underscores
echo preg_replace('~[^a-z]~', '_', strtolower($string));

echo "\n\n";
// notice the consecutive underscores
echo str_replace(' ', '_', preg_replace('~[^a-z ]+~', '', strtolower($string)));

echo "\n\n";
// notice no consecutive underscores
echo preg_replace(['~[^a-z ]+~', '~ +~'], ['', '_'], strtolower($string));

输出:

_here__is__a__special__title_____it_s_fine__right_

here_is_a_special_title__its_fine_right

here_is_a_special_title_its_fine_right

第一种技术将每个非字母字符分别替换为下划线。

第二种技术删除连续的非字母和非空格字符序列,然后用下划线单独替换每个空格。

第三种技术删除连续的非字母和非空格字符序列,然后用下划线替换连续的空格序列。

于 2018-04-21T07:14:34.460 回答