При использовании preg_replace я получаю двойные символы ...? - PullRequest
2 голосов
/ 16 декабря 2010

Когда я использую следующий скрипт, я получаю двойные символы. Почему?

$clean_lastname = "Dür";
$clean_lastname = preg_replace("/[ùúûü]/", "u", $clean_lastname);
echo $clean_lastname;

Выход: Duur

Я хочу, чтобы это было Dur.

Я все еще делаю что-то не так ... Что случилось с 'помещением одного значения массива в функцию preg?

$clean_lastname = "Boerée";
$l = 0;
$pattern = array('[ÀÁÂÃÄÅ]','[Ç]','[ÈÉÊË]','[ÌÍÎÏ]','[Ñ]','[ÒÓÔÕÖØ]','[Ý]','[ß]','[àáâãäå]','[ç]','[èéêë]','[ìíîï]','[ñ]','[òóôõöø]','[ùúûü]','[ýÿ]');
$replace = array(A,C,E,I,N,O,Y,S,a,c,e,i,n,o,u,y);

foreach ($pattern as $wierdchar)
{
    $clean_lastname = preg_replace('/$wierdchar/u', '$replace[$l]', $clean_lastname);
    $l++;
}

//$clean_lastname = preg_replace('/[èéêë]/u', 'e', $clean_lastname);

//$clean_lastname = strtr($clean_lastname, "ùúûü","uuuu");
echo $clean_lastname;

Ответы [ 4 ]

2 голосов
/ 16 декабря 2010

Единственная ситуация, которую я могу изобразить, это случиться, когда две строки (входная строка и шаблон) имеют разную кодировку символов или обе имеют UTF-8, но вы не указали это правильно.

Поскольку в последнем случае "Dür" эквивалентно "D\xC3\xBCr" (ü кодируется двухбайтовой последовательностью 0xC3BC), а шаблон "/[ùúûü]/" эквивалентен "/[\xC3\xB9\xC3\xBA\xC3\xBB\xC3\xBC]/".Поскольку каждый байт, указанный в escape-последовательности \xHH, обрабатывается как один символ, это приводит к следующему результату:

echo preg_replace("/[\xC3\xB9\xC3\xBA\xC3\xBB\xC3\xBC]/", "u", "D\xC3\xBCr");  // Duur

Поэтому при работе с UTF-8 обязательно установите u флаг модификатора , чтобы шаблон и входная строка обрабатывались в кодировке UTF-8:

"/[ùúûü]/u"

Редактировать Теперь, когда вы уточнили свои намеренияи вы, похоже, пытаетесь реализовать какую-то транслитерацию , вам следует взглянуть на iconv и его способность транслитерировать:

iconv("UTF-8", "US-ASCII//TRANSLIT", $str)

См. такжедругие связанные темы, такие как:

1 голос
/ 16 декабря 2010
$clean_lastname = str_replace(array('ù', 'ú', 'û', 'ü', 'Ù', 'Ú', 'Û', 'Ü'), array('u', 'u', 'u', 'u', 'U', 'U', 'U', 'U'), $clean_lastname);

// ИЛИ, чтобы решить вашу начальную проблему:

$clean_lastname = preg_replace('/[ùúûü]/u', 'u', $clean_lastname);
1 голос
/ 16 декабря 2010

палка с оригиналом strtr

$clean_lastname = "Dür Dùr Dúr Dûr";
$clean_lastname = strtr($clean_lastname, "ùúûü", "uuuu");
echo $clean_lastname;
1 голос
/ 16 декабря 2010
<?php
    $vowels = array("ù","ú","û","ü" );
    $consonents = array("u","u","u","u");
    $clean_lastname = "Dür";
    echo str_replace( $vowels, $consonents, $clean_lastname);
?>
...