Как я могу preg_replace специальные символы, такие как Prêt-à-porter - PullRequest
2 голосов
/ 12 января 2010

Об этом есть куча вопросов на этом форуме и в Интернете в целом. Но я не просто понимаю.

Вот мой код:

function updateGuideKeywords($dal)
{
    $pattern = "/[^a-zA-Z-êàé]/";
    $keywords = preg_replace($pattern, '', $_POST['keywords']);
    echo json_encode($keywords);
}

Теперь вход Prêt-à-porter, а вывод "Pr\u00eat-\u00e0-porter".

Почему я получаю '\ u00e'?

И как я могу изменить свой шаблон, чтобы включить символы ê, à и é?

EDIT
хм ... так как это похоже на проблему Unicode / символов, я мог бы пойти на решение, которое я нашел на этой странице .

Здесь они предлагают сделать что-то вроде этого:

$chain="prêt-à-porter";

$pattern = array("'é'", "'è'", "'ë'", "'ê'", "'É'", "'È'", "'Ë'", "'Ê'", "'á'", "'à'", "'ä'", "'â'", "'å'", "'Á'", "'À'", "'Ä'", "'Â'", "'Å'", "'ó'", "'ò'", "'ö'", "'ô'", "'Ó'", "'Ò'", "'Ö'", "'Ô'", "'í'", "'ì'", "'ï'", "'î'", "'Í'", "'Ì'", "'Ï'", "'Î'", "'ú'", "'ù'", "'ü'", "'û'", "'Ú'", "'Ù'", "'Ü'", "'Û'", "'ý'", "'ÿ'", "'Ý'", "'ø'", "'Ø'", "'œ'", "'Œ'", "'Æ'", "'ç'", "'Ç'");

$replace = array('e', 'e', 'e', 'e', 'E', 'E', 'E', 'E', 'a', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A', 'A', 'o', 'o', 'o', 'o', 'O', 'O', 'O', 'O', 'i', 'i', 'i', 'I', 'I', 'I', 'I', 'I', 'u', 'u', 'u', 'u', 'U', 'U', 'U', 'U', 'y', 'y', 'Y', 'o', 'O', 'a', 'A', 'A', 'c', 'C'); 

$chain = preg_replace($pattern, $replace, $chain);

РЕДАКТИРОВАТЬ 2
Это мое решение до сих пор:

function updateGuideKeywords()
{
    //First we replace characters with accents
    $pattern = array("'é'", "'è'", "'ë'", "'ê'", "'É'", "'È'", "'Ë'", "'Ê'", "'á'", "'à'", "'ä'", "'â'", "'å'", "'Á'", "'À'", "'Ä'", "'Â'", "'Å'", "'ó'", "'ò'", "'ö'", "'ô'", "'Ó'", "'Ò'", "'Ö'", "'Ô'", "'í'", "'ì'", "'ï'", "'î'", "'Í'", "'Ì'", "'Ï'", "'Î'", "'ú'", "'ù'", "'ü'", "'û'", "'Ú'", "'Ù'", "'Ü'", "'Û'", "'ý'", "'ÿ'", "'Ý'", "'ø'", "'Ø'", "'œ'", "'Œ'", "'Æ'", "'ç'", "'Ç'");
    $replace = array('e', 'e', 'e', 'e', 'E', 'E', 'E', 'E', 'a', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A', 'A', 'o', 'o', 'o', 'o', 'O', 'O', 'O', 'O', 'i', 'i', 'i', 'I', 'I', 'I', 'I', 'I', 'u', 'u', 'u', 'u', 'U', 'U', 'U', 'U', 'y', 'y', 'Y', 'o', 'O', 'a', 'A', 'A', 'c', 'C');        $shguideID = $_POST['shguideID'];
    $keywords = preg_replace($pattern, $replace, $_POST['keywords']);
    //Then we remove unwanted characters by only allowing a-z, A-Z, comma, 'minus' and white space
    $keywords = preg_replace("/[^a-zA-Z-,\s]/", "", $keywords);

    echo json_encode($keywords);
}

Ответы [ 6 ]

4 голосов
/ 12 января 2010

Если вы хотите заменить 'é' на 'e' и т.д., используйте iconv () с модификатором // TRANSLIT

например,

$newString = iconv('UTF-8', 'ASCII//TRANSLIT', $myString);

Более полный пример:

$ cat scratch.php
<?php
$x = "Prêt-à-porter";
var_dump(json_encode(iconv("UTF-8", "ASCII//TRANSLIT", $x)));


$ php scratch.php
string(15) ""Pret-a-porter""
$ 
4 голосов
/ 12 января 2010

"Pr\u00eat-\u00e0-porter" - правильное строковое литеральное представление JavaScript Prêt-à-porter. Я предполагаю, что вы делаете json_encode в какой-то момент вдоль линии?

Также обратите внимание, что регулярные выражения PHP не поддерживают Unicode, поэтому, если вы используете UTF-8 (как правило, вам и нужно), символ ê - это не один символ, а байт C3 с последующим байтом AA , Это хорошо для простых литеральных соответствий, но в ситуациях, подобных классу символов, вы теперь сопоставляете два байта отдельно, а не один за другим, что может легко испортить ваше выражение.

0 голосов
/ 20 октября 2011

Вы также можете использовать mb_ereg_replace () для работы с многобайтовыми символами в вашей строке.

0 голосов
/ 12 января 2010

Ваш код с последними изменениями, действующими на данный момент, работает следующим образом:

  1. Выражение /[^a-zA-Z-êàé]/ означает «соответствовать чему-либо, что не Английская буква, знак минуса, ê, à или é».

  2. preg_replace($pattern, '', 'Prêt-à-porter') возвращает 'Prêt-à-porter', поскольку ничего не найдено.

  3. json_encode () возвращает JSON-представление 'Prêt-à-porter', который является 'r \ u00eat- \ u00e0-porter'

Мне не ясно, какова ваша точная цель. Если вы хотите удалить все, что не является минусом или буквой, вы можете попробовать этот шаблон:

/[^\w0-9]/u
0 голосов
/ 12 января 2010

Из того, что я вижу в вашем выводе, ваши символы не удаляются (следовательно, в вашем шаблоне), поэтому единственное, что вывод выполняется в юникоде. Попробуйте изменить свой документ на UTF-8 или кодировать объекты HTML, и это должно работать, но будьте осторожны, если вы кодируете объекты перед заменой, они не будут обнаружены, так как они уже будут преобразованы.

0 голосов
/ 12 января 2010

это может быть не на 100% точно, но, глядя на регулярное выражение вашего использования, я не думаю, что preg_replace () является проблемой. Я думаю, что причина того, что вы получаете '\ u00e', заключается в плохой поддержке php кодировки символов.

...