PHP:替换字符串中的外来字符

时间:2012-05-04 07:55:12

标签: php oop function

$fileSyntax = strtolower(preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($fileSyntax, ENT_QUOTES, 'UTF-8'))); // remove foreign character accents
$fileSyntax = preg_replace("/[^a-zA-Z0-9\s]/", "", $fileSyntax); // remove anything that's not alphanumeric, or a space
$fileSyntax = preg_replace("/\s+/", "-", $fileSyntax); // replace space with hyphen     
$fileSyntax = trim($fileSyntax, "-"); // removes prefixing and trailing hyphen

以上代码将产生以下内容:

Pokémon = pokemon
YO MAN! = yo-man

我想重写这个以提高效率,并在不久之后将其转换为函数。

如何使用多个preg_replace()以便这不是多行代码?

6 个答案:

答案 0 :(得分:1)

你知道吗,这一行:

$fileSyntax = preg_replace("/[^a-zA-Z0-9\s]/", "", $fileSyntax);

应该包含连字符,或者你要阻止人们输入ice-skate,例如它会变成iceskate。

$fileSyntax = preg_replace("/[^a-zA-Z0-9\s-]/", "", $fileSyntax);

空格应该用下划线替换(在我看来),因为连字符可以用在单词中。

你也可以为你的功能做到这一点:

function replace_chars($fileSyntax){
    return strtolower(
        preg_replace(
            array(
                "/&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);/i",
                "/[^a-zA-Z0-9\s-]/i",
                "/\s+/"
            ),
            array(
                "$1", // remove foreign character accents
                "", // remove anything that's not alphanumeric, hyphen or a space
                "_" // replace space with underscore 
            ), htmlentities($fileSyntax, ENT_QUOTES, 'UTF-8')
        )
    );
}

从技术上讲,它只是一行代码,只是间隔开来,以便于阅读和理解正在发生的事情。你可以通过replace_chars("TeRríbLé(!) STRinG :)");来回复terrible_string

答案 1 :(得分:0)

你可以将preg_replaces作为主题参数,这样替换返回的主题就是替换的主题等等......

答案 2 :(得分:0)

这个功能可以解决我认为的一部分问题: http://www.php.net/manual/en/function.iconv.php 它会通过替换特殊字符将您的字符串转换为另一个字符集。

答案 3 :(得分:0)

多行代码或函数没有任何问题,读取和使用相同的代码就更清晰了,这是因为如果某些东西是串行它将保持串行和执行所需的时间也是一样的,如果你想加快这个过程,你可以尝试让并行线程在同一个黑板上工作,但这样会相当复杂(你需要解决所有冲突问题。)

答案 4 :(得分:0)

只需使用我的超级功能:

  function text2url($chaine)
    {
    $chaine = htmlentities($chaine, ENT_NOQUOTES, 'utf-8');
    $chaine = preg_replace('#\&([A-za-z])(?:uml|circ|tilde|acute|grave|cedil|ring)\;#', '\1', $chaine);
    $chaine = preg_replace('#\&([A-za-z]{2})(?:lig)\;#', '\1', $chaine);
    $chaine = preg_replace('#\&[^;]+\;#', '', $chaine);
    $chaine = preg_replace('/[^a-zA-Z0-9_ %\[\]\.\(\)%&-]/s', '', $chaine);
    $chaine = str_replace('(', '', $chaine);
    $chaine = str_replace(')', '', $chaine);
    $chaine = str_replace('[', '', $chaine);
    $chaine = str_replace(']', '', $chaine);
    $chaine = str_replace('.', '-', $chaine);
    $chaine = trim($chaine);
    $chaine = str_replace(' ', '_', $chaine);

    return $chaine;
    }

答案 5 :(得分:0)

还有另一种方法可以删除字符串中的重音符号。我写了这个函数用于我的应用程序,其语言是葡萄牙语 - 这意味着它具有你可以想象的所有变音符号。它就像一个魅力:

set @runsum:=0;

select id, (@runsum := @runsum + `in` - `out`) as runner
  from product_trans
order by id;

}