【问题标题】:PHP mb_ereg_replace not replacing while preg_replace works as intendedPHP mb_ereg_replace 未替换 preg_replace 按预期工作
【发布时间】:2011-04-05 09:50:06
【问题描述】:

我正在尝试用空字符串替换字符串中的所有非单词字符,期望空格并将所有多个空格放在一起作为一个空格。

以下代码执行此操作。

$cleanedString = preg_replace('/[^\w]/', ' ', $name);  
$cleanedString = preg_replace('/\s+/', ' ', $cleanedString);

但是当我尝试使用 mb_ereg_replace 时,没有任何反应。

$cleanedString = mb_ereg_replace('/[^\w]/', ' ', $name);  
$cleanedString = mb_ereg_replace('/\s+/', ' ', $cleanedString);

$cleanedString 与上述情况下的 if $name 相同。我做错了什么?

【问题讨论】:

    标签: php regex pcre multibyte


    【解决方案1】:

    mb_ereg_replace 不使用分隔符。您之前可能还必须指定编码,也可能不必指定。

    mb_regex_encoding("UTF-8");
    //regex could also be \W
    $cleanedString = mb_ereg_replace('[^\w]', ' ', $name);
    $cleanedString = mb_ereg_replace('\s+', ' ', $cleanedString);
    

    【讨论】:

    • 谢谢,这是我犯的错误。如果我的输入是 UTF-8,是否有关于使用哪种方法的建议?
    • @Jithin 如果是 UTF-8,你不妨使用 preg_replaceu 标志:preg_replace('/\s+/u', ' ', $cleanedString);
    • @Artefacto 谢谢。您能否告诉我假设只要输入采用 UTF-8 编码,preg_replace 将适用于大多数语言是否安全?
    • @Jithin 取决于您对“作品”的含义。严格意义上来说,它可以工作——不会产生损坏的数据,但它可能不会做你想做的事。考虑第一个正则表达式。在 PCRE(引擎 preg_replace 使用)中,\w 仅表示 [a-zA-Z0-9_]。如果要消除所有非单词字符,更好的选择是使用[^\p{L}\p{Nd}\p{Mn}_]。这将匹配所有不是(每个 Unicode)字母、非空格标记(用于重音等)、十进制数字和下划线的字符。
    • @Jithin No. 它使用oniguruma。默认情况下,\w 表示 (Letter|Mark|Number|Connector_Punctuation)。
    【解决方案2】:
    function create_slug_html($string, $ext='.html'){     
       $replace = '-';         
       $string=strtolower($string);     
       $string=trim($string);
    
        mb_regex_encoding("UTF-8");
        //regex could also be \W
        $string= mb_ereg_replace('[^\w]', ' ', $string);
        $string= mb_ereg_replace('\s+', ' ', $string);
    
       //remove query string     
       if(preg_match("#^http(s)?://[a-z0-9-_.]+\.[a-z]{2,4}#i",$string)){         
             $parsed_url = parse_url($string);         
             $string = $parsed_url['host'].' '.$parsed_url['path'];         
             //if want to add scheme eg. http, https than uncomment next line         
             //$string = $parsed_url['scheme'].' '.$string;     
       }      
       //replace / and . with white space     
       $string = preg_replace("/[\/\.]/", " ", $string);   
    
       // $string = preg_replace("/[^a-z0-9_\s-]/", "", $string);  
    
       //remove multiple dashes or whitespaces     
       $string = preg_replace("/[\s-]+/", " ", $string);   
    
       //convert whitespaces and underscore to $replace     
       $string = preg_replace("/[\s_]/", $replace, $string);     
       //limit the slug size     
       $string = substr($string, 0, 200);     
       //slug is generated     
       return ($ext) ? $string.$ext : $string; 
    

    }

    请检查是否可以并支持英文和unicode

    【讨论】:

    • 虽然不禁止仅使用代码的答案,但请理解这是一个问答社区,而不是众包社区,并且通常,如果 OP 理解作为答案发布的代码,他/她会自己想出一个类似的解决方案,并且不会一开始就发布问题。因此,请通过解释如何和/或为什么起作用,为您的答案和/或代码提供上下文。
    【解决方案3】:

    输入不是Multi-Byte,因此mb 函数失败。

    【讨论】:

    • 好的。但是,如果我的输入是 UTF-8,你能解释一下我们什么时候应该使用 mb_ereg_replace 而不是 preg_replace。目前我将英文文本作为 $name 传递。但是如果明天我用其他语言说印地语,我的代码会被破解吗?
    • 错了。多字节扩展可以处理单字节编码。
    猜你喜欢
    • 2012-10-31
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    相关资源
    最近更新 更多