PHP正则表达式解决方案 - 删除一些特殊字符并用文本替换一些

时间:2012-03-15 18:44:00

标签: php regex

我有一个PHP变量,比如说

$myvariable = "te    xt!@ na#@)(me+=&t^*ext?>;.'na^%me";

我想用单个下划线_替换特殊字符和特殊字符组,包括空格。该字符串可能包含&,可能会被and替换。

上一个变量的结果应为;

te_xt_na_me_andt_ext_na_me

我如何在PHP中执行此操作?

2 个答案:

答案 0 :(得分:3)

这假定任何,但“字符”被认为是一次性的。

$patterns = array(
    '/&/'             => 'and',  // Ampersand to "and"
    '/[^[:alpha:]]+/' => '_'     // Anything *but* a character to underscore
);

$result = preg_replace(array_keys($patterns), array_values($patterns), $input);

最后一个模式根据当前语言环境 1 (因此包括空格)替换一个或多个“非单词”字符出现的组。


1 旁注(可能无关紧要):如果运行脚本的服务器具有en_US作为区域设置,则会发生以下替换:

$input = 'app!le___s &!   orän=%ges';
$result = 'app_le_s_and_or_n_ges';

如果语言环境为de_DE,则结果为:

$result = 'app_le_s_and_orän_ges';

因为ä是此特定区域设置中[[:alpha:]]的一部分。避免这种情况的明显解决方案是用[a-zA-Z]替换字符类。

答案 1 :(得分:2)

这应该这样做:

$myvariable = str_replace('&','and',$myvariable)
$myvariable = preg_replace ('/[^a-z]+/i', '_' , $myvariable)

请参阅:http://php.net/manual/de/function.preg-replace.php

方括号内的插入符号(^)表示查找未在括号中声明的所有内容。所以每个特殊角色都不是“a-z”。加号表示应该匹配多个出现的信号。分界斜杠后面的“i”意味着进行不区分大小写的搜索。