php 用连字符[重复]替换所有非字母和数字的字符

k0pti3hp  于 2023-06-04  发布在  PHP
关注(0)|答案(3)|浏览(358)

此问题已在此处有答案

Convert string into slug with single-hyphen delimiters only(10个答案)
3年前关闭。
我正面临着一个问题与网址,我希望能够转换标题,可以包含任何东西,并有他们剥夺了所有特殊字符,使他们只有字母和数字,当然我想取代空格与连字符。
这将如何实现?我听说过很多关于正则表达式(regex)的使用。

dsekswqp

dsekswqp1#

这应该是你想要的:

function clean($string) {
   $string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens.

   return preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars.
}

用法:

echo clean('a|"bc!@£de^&$f g');

将输出:abcdef-g

编辑:

嘿,只是一个快速的问题,我如何才能防止多个连字符彼此相邻?然后把它们换成1

function clean($string) {
   $string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens.
   $string = preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars.

   return preg_replace('/-+/', '-', $string); // Replaces multiple hyphens with single one.
}
ffx8fchx

ffx8fchx2#

改进清理

下面的解决方案有一个“SEO友好”版本:

function hyphenize($string) {
    $dict = array(
        "I'm"      => "I am",
        "thier"    => "their",
        // Add your own replacements here
    );
    return strtolower(
        preg_replace(
          array( '#[\\s-]+#', '#[^A-Za-z0-9. -]+#' ),
          array( '-', '' ),
          // the full cleanString() can be downloaded from http://www.unexpectedit.com/php/php-clean-string-of-utf8-chars-convert-to-similar-ascii-char
          cleanString(
              str_replace( // preg_replace can be used to support more complicated replacements
                  array_keys($dict),
                  array_values($dict),
                  urldecode($string)
              )
          )
        )
    );
}

function cleanString($text) {
    $utf8 = array(
        '/[áàâãªä]/u'   =>   'a',
        '/[ÁÀÂÃÄ]/u'    =>   'A',
        '/[ÍÌÎÏ]/u'     =>   'I',
        '/[íìîï]/u'     =>   'i',
        '/[éèêë]/u'     =>   'e',
        '/[ÉÈÊË]/u'     =>   'E',
        '/[óòôõºö]/u'   =>   'o',
        '/[ÓÒÔÕÖ]/u'    =>   'O',
        '/[úùûü]/u'     =>   'u',
        '/[ÚÙÛÜ]/u'     =>   'U',
        '/ç/'           =>   'c',
        '/Ç/'           =>   'C',
        '/ñ/'           =>   'n',
        '/Ñ/'           =>   'N',
        '/–/'           =>   '-', // UTF-8 hyphen to "normal" hyphen
        '/[’‘‹›‚]/u'    =>   ' ', // Literally a single quote
        '/[“”«»„]/u'    =>   ' ', // Double quote
        '/ /'           =>   ' ', // nonbreaking space (equiv. to 0x160)
    );
    return preg_replace(array_keys($utf8), array_values($utf8), $text);
}

上述功能的基本原理(我发现 * 方式 * 效率低下-下面的一个更好)是 * 一个服务,不应命名 * 显然运行拼写检查和关键字识别的网址。
在一个客户的偏执狂上失去了很长一段时间后,我发现他们根本不是在想象事情--他们的SEOMaven[我绝对不是一个]报告说,比如说,将“Viaggi Economy Perù”转换为viaggi-economy-peruviaggi-economy-per“表现更好”(之前的“清理”删除了UTF8字符;波哥大变成了波哥大麦德林变成了梅德尔恩,等等)。
还有一些常见的拼写错误似乎影响了结果,对我来说唯一有意义的解释是,我们的URL被拆开了,单词被挑出来,并被用来驱动上帝知道的排名算法。这些算法显然已经被输入了经过UTF8清理的字符串,因此“Perù”变成了“秘鲁”而不是“Per”。“每”不匹配,有点把它的脖子。
为了保留UTF8字符并替换一些拼写错误,下面的更快的函数变得更准确(?)功能以上。当然,$dict需要手工定制。

上一个答案

一个简单的方法:

// Remove all characters except A-Z, a-z, 0-9, dots, hyphens and spaces
// Note that the hyphen must go last not to be confused with a range (A-Z)
// and the dot, NOT being special (I know. My life was a lie), is NOT escaped

$str = preg_replace('/[^A-Za-z0-9. -]/', '', $str);

// Replace sequences of spaces with hyphen
$str = preg_replace('/  */', '-', $str);

// The above means "a space, followed by a space repeated zero or more times"
// (should be equivalent to / +/)

// You may also want to try this alternative:
$str = preg_replace('/\\s+/', '-', $str);

// where \s+ means "zero or more whitespaces" (a space is not necessarily the
// same as a whitespace) just to be sure and include everything

请注意,您可能必须首先urldecode() URL,因为%20和+实际上都是空格-我的意思是,如果您有“Never%20gonna%20give%20you%20up”,您希望它成为Never-gonna-give-you-up,而不是 * Never 20 gonna 20 give 20 you 20 up *。你可能不需要,但我想我应该提一下这个可能性。
因此,完成的功能沿着测试用例:

function hyphenize($string) {
    return 
    ## strtolower(
          preg_replace(
            array('#[\\s-]+#', '#[^A-Za-z0-9. -]+#'),
            array('-', ''),
        ##     cleanString(
              urldecode($string)
        ##     )
        )
    ## )
    ;
}

print implode("\n", array_map(
    function($s) {
            return $s . ' becomes ' . hyphenize($s);
    },
    array(
    'Never%20gonna%20give%20you%20up',
    "I'm not the man I was",
    "'Légeresse', dit sa majesté",
    )));

Never%20gonna%20give%20you%20up    becomes  never-gonna-give-you-up
I'm not the man I was              becomes  im-not-the-man-I-was
'Légeresse', dit sa majesté        becomes  legeresse-dit-sa-majeste

为了处理UTF-8,我使用了一个在网上找到的cleanString实现(链接中断了,但是在答案的开头有一个包含所有不太深奥的UTF8字符的精简副本;如果需要的话,也可以很容易地添加更多的字符),它将UTF8字符转换为普通字符,从而尽可能地保留单词“look”。它可以被简化并 Package 在这里的函数中以提高性能。
上面的函数也实现了转换为小写-但这是一种尝试。这样做的代码已被注解掉。

gorkyyrv

gorkyyrv3#

看看这个函数:

function seo_friendly_url($string){
    $string = str_replace(array('[\', \']'), '', $string);
    $string = preg_replace('/\[.*\]/U', '', $string);
    $string = preg_replace('/&(amp;)?#?[a-z0-9]+;/i', '-', $string);
    $string = htmlentities($string, ENT_COMPAT, 'utf-8');
    $string = preg_replace('/&([a-z])(acute|uml|circ|grave|ring|cedil|slash|tilde|caron|lig|quot|rsquo);/i', '\\1', $string );
    $string = preg_replace(array('/[^a-z0-9]/i', '/[-]+/') , '-', $string);
    return strtolower(trim($string, '-'));
}

相关问题