Regex eregi_替换为preg_替换转换材料

Regex eregi_替换为preg_替换转换材料,regex,Regex,正则表达式不是它的强项。 我能做简单的事情,但这件事让我恼火!! 有人能帮我一下吗 以下是代码中的注释: //如果utf8检测以前不起作用,作为最后的手段,去掉那些奇怪的字符作为下划线 eregi_replace("[^a-z0-9 \-\.\(\)\/\\]","_",$str); (这是我试过的) 有没有任何正则表达式专业人士帮我一把?您需要指定正则表达式标识符,例如或/ preg_replace("#[^a-z0-9 \-\.\(\)\/\\]#i","_",$str); 因此,您应该

正则表达式不是它的强项。 我能做简单的事情,但这件事让我恼火!! 有人能帮我一下吗

以下是代码中的注释:

//如果utf8检测以前不起作用,作为最后的手段,去掉那些奇怪的字符作为下划线

eregi_replace("[^a-z0-9 \-\.\(\)\/\\]","_",$str);
(这是我试过的)


有没有任何正则表达式专业人士帮我一把?

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

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

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

首先,我认为
{
}
可以作为来自标志的表达式的分隔符,但是我知道有些正则表达式风格不支持它,所以最好只使用
之类的东西
#

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

但是,替换表达式需要使用preg notation/flavor,因此有规则更改:

  • 即使有了新的规则,字符类中也很少需要转义
  • \
    字符需要转义两次-字符串转义一次,正则表达式转义一次-否则,它将转义结束括号
    ]
  • 假设您想要匹配破折号(或者更确切地说是匹配破折号以外的其他东西),则需要将其移动到类的末尾
因此,我相信以下几点可以满足您的需要:

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

print($blah);
$source='hello!@$%^&*wazzup-dawg?()/\\[]{}:';
$blah=preg\u replace(“![^a-z0-9./\\\-]!i',“\\',$source”);
印刷(废话);
preg\u replace(“{[^a-z0-9]-.()/\/}i”、“\u”、$str)

很好用


我用所有的#和/和{都试过了,它们都起了作用。

PHP支持这两种类型的定界已经有一段时间了,所以这不是表达式的问题,尽管改变它们可能不是个坏主意!没关系,我明白了。它变成了preg\u replace({[^a-z0-9]-\.()/\/\/}I,“\u”,$str)不过,我会小心的-我不认为
eregi\u replace
和你建议的
preg\u replace
表达式几乎是等价的。我建议彻底测试它,如果你仍然觉得它是答案,就把它作为答案发布并接受它
$source = 'hello! @#$%^&* wazzup-dawg?.()/\\[]{}<>:"';
$blah = preg_replace('![^a-z0-9 .()/\\\\-]!i','_',$source);

print($blah);