如何解决警告:preg_replace():编译失败:偏移量为1的UTF-8字符串无效

时间:2016-12-19 10:30:34

标签: php regex utf-8

我正在尝试将以下文字重写为网址

$string="Jean-Maxime . Thäre! wouldn't %bé#äny ąśćłóżźń. OEß L'élève
&nbsp; % áàâãªä que voici est allé voir ça. Ils ont découvert où elles avaient cachées la Sainte Bible ?! <h3>\"Je suis riche\"</h3> ";

并且我有3个函数但不知何故它为其中一个函数返回以下错误警告:preg_replace():编译失败:偏移1处的无效UTF-8字符串

服务器说错误在这一行

$text =preg_replace(array_keys($utf8), array_values($utf8), $text);

以下是我的3个功能:

function normaliser($string)
{
    $string = strip_tags(mb_strtolower($string));




    return preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8'));
}
################################################################################
//On enleve les accents et on normalise le texte
function enlever_accents($text) {

     $utf8 = array(
    '/[áàâãªä]/u'   =>   'a',
    '/[ÁÀÂÃÄ]/u'    =>   'A',
    '/[ÍÌÎÏ]/u'     =>   'I',
    '/[íìîï]/u'     =>   'i',
    '/[éèêë]/u'     =>   'e',
    '/[ÉÈÊË]/u'     =>   'E',
    '/[óòôõºö]/u'   =>   'o',
    '/[ÓÒÔÕÖ]/u'    =>   'O',
    '/[úùûü]/u'     =>   'u',
    '/[ÚÙÛÜ]/u'     =>   'U',
    '/ç/u'           =>   'c',
    '/Ç/u'           =>   'C',
    '/ñ/u'           =>   'n',
    '/Ñ/u'           =>   'N',
    '/[\²&~#"\'{(\[|`_\^\)°+=}*;:!§?%’,;]/u'    =>   '', //J'enleve les caracteres speciaux
    '/–/u'           =>   '-', // UTF-8 hyphen to "normal" hyphen
    '/[’‘‹›‚]/u'    =>   ' ', // Literally a single quote
    '/[“”«»„]/u'    =>   ' ', // Double quote
    '/ /u'           =>   ' ', // nonbreaking space (equiv. to 0x160)
);




     $text =preg_replace(array_keys($utf8), array_values($utf8), $text);

    $text =mb_strtolower($text);


    return  normaliser($text);
}

######################################################################### 

//Fonction qui permet de reecrire les urls
function reecrire_url_titre($string) {


   $string=  enlever_accents($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.
}

问题主要出在这个

function enlever_accents($text) {

    $utf8 = array(
        '/[áàâãªä]/u'   =>   'a',
        '/[ÁÀÂÃÄ]/u'    =>   'A',
        '/[ÍÌÎÏ]/u'     =>   'I',
        '/[íìîï]/u'     =>   'i',
        '/[éèêë]/u'     =>   'e',
        '/[ÉÈÊË]/u'     =>   'E',
        '/[óòôõºö]/u'   =>   'o',
        '/[ÓÒÔÕÖ]/u'    =>   'O',
        '/[úùûü]/u'     =>   'u',
        '/[ÚÙÛÜ]/u'     =>   'U',
        '/ç/u'           =>   'c',
        '/Ç/u'           =>   'C',
        '/ñ/u'           =>   'n',
        '/Ñ/u'           =>   'N',
        '/[\²&~#"\'{(\[|`_\^\)°+=}*;:!§?%’,;]/u'    =>   '', //J'enleve les caracteres speciaux
        '/–/u'           =>   '-', // UTF-8 hyphen to "normal" hyphen
        '/[’‘‹›‚]/u'    =>   ' ', // Literally a single quote
        '/[“”«»„]/u'    =>   ' ', // Double quote
        '/ /u'           =>   ' ', // nonbreaking space (equiv. to 0x160)
    );


    $text = htmlentities($text, ENT_QUOTES, 'UTF-8');

     $text =preg_replace(array_keys($utf8), array_values($utf8), $text);

    $text =mb_strtolower($text);


    return  $text;
}

请问如何解决警告:preg_replace():编译失败:偏移1处的UTF-8字符串无效?

1 个答案:

答案 0 :(得分:1)

要用PHP替换重音字母,方法不是使用正则表达式(在您的情况下为几个),而是使用<ul> <li><a [routerLink]="['/NewPage']">NewPage</a></li> <li><a [routerLink]="['/EmployeeData']">Security Dashboard</a></li> </ul> <div> <router-outlet></router-outlet> </div>

iconv

您还需要确保您的字符串在UTF-8编码字符串的开头。否则,请在使用$yourstring = Normalizer::normalize($yourstring, Normalizer::NFC); setlocale(LC_CTYPE, 'fr_FR'); $result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $yourstring);

之前进行转换

然后处理其他角色,如果我理解你的意图,你需要做的就是只做一次替换并修剪:

mb_convert

(在字符类中输入要保留的所有字符)

$result = trim(preg_replace('~[^a-z0-9]+~i', '-', $result), '-');