在php preg_replace中允许点

时间:2011-02-23 21:32:22

标签: php regex preg-replace

我正在使用The perfect PHP clean url generator使用上传脚本清理一些文件名(以及在其他地方清理我的永久链接)。如果函数如下所示,我如何修改它以允许.

setlocale(LC_ALL, 'en_US.UTF8');
function toAscii($str, $replace=array(), $delimiter='-', $exception = '') {
    if( !empty($replace) ) {
        $str = str_replace((array)$replace, ' ', $str);
    }

    $clean = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
    $clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $clean);
    $clean = strtolower(trim($clean, '-'));
    $clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean);

    return $clean;
}

提前致谢。

编辑稍微修改了这个功能以反映我的实际用法 - 抱歉。

2 个答案:

答案 0 :(得分:7)

所以你只是想避免替换文字.字符,这是正确的吗?如果点在字符类中,则应按字面解释,因此您的第一个正则表达式就会变为:

$clean = preg_replace("/[^a-zA-Z0-9\/_|+ .-]/", '', $clean);

答案 1 :(得分:0)

不是答案,只需注意一些事项:

RegEx设置:

$clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $clean);
$clean = strtolower(trim($clean, '-'));
$clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean);

上面的破折号应位于集合的开头:

$clean = preg_replace("/[^-a-zA-Z0-9\/_|+ ]/", '', $clean);
$clean = strtolower(trim($clean, '-'));
$clean = preg_replace("/[-\/_|+ ]+/", $delimiter, $clean);

如果它们不在开头,则表示范围字符,即[A-Za-z0-9]。

可以帮助别人。