eregi_replace到preg_replace转换的东西

时间:2011-10-20 18:22:43

标签: regex

正则表达式不是强点。 我可以做一些简单的事情,但这个只是我的山羊! 那么有人可以帮我一把。

以下是代码中的注释:

//如果utf8检测之前没有工作,请删除下划线的那些奇怪的字符,作为最后的手段。

eregi_replace("[^a-z0-9 \-\.\(\)\/\\]","_",$str);

到(这是我试过的)

preg_replace("{[^a-z0-9 \-\.\(\)\/\\]}i","_",$str);

那些帮我一把的正则表达式专业人士?

3 个答案:

答案 0 :(得分:1)

您需要指定正则表达式标识符,例如#/

preg_replace("#[^a-z0-9 \-\.\(\)\/\\]#i","_",$str);

因此,您应该将正则表达式括在这些标识符字符中。

答案 1 :(得分:1)

首先,我相信{}可以作为来自旗帜的表达式的分隔符,但我知道有一些不支持它的正则表达式,所以它可能是一个使用!#

之类的好主意

其次,我不确定该表达式之前是如何工作的,因为AFAIK使用\字符转义不适用于ERE表达式。您必须根据他们在班级中的位置来表示^-]等特殊字符(^不能是第一个字符,]必须是第一个字符,-必须是第一个或最后一个字符。第一个表达式中的-字符将被解释为范围说明符(在本例中为\\之间范围内的字符)。此外,\字符按字面意思处理,因此您看起来很混乱,而且大部分是冗余的正则表达式。

然而,替换表达式需要使用preg符号/ flavor,因此有规则更改:

  • 即使使用新规则,很少有需要在角色类中进行转义
  • \字符需要转义两次 - 一次用于字符串,然后又一次用于正则表达式 - 否则,它将转义结束括号]
  • 假设您想要匹配破折号(或者更确切地说匹配破折号以外的东西,则需要将其移动到类的末尾

所以,这里有一些code (link),我相信你需要做的事情:

$source = 'hello! @#$%^&* wazzup-dawg?.()/\\[]{}<>:"';
$blah = preg_replace('![^a-z0-9 .()/\\\\-]!i','_',$source);

print($blah);

答案 2 :(得分:0)

的preg_replace( “{[^一个-Z0-9] - ()/ \ /} I”, “_”,$ STR)

工作正常。

我尝试了所有#和/和{并且他们都工作了。