Разбор многобайтовой строки в PHP - PullRequest
6 голосов
/ 07 апреля 2010

Я хотел бы написать (HTML) парсер на основе конечного автомата, но у меня есть сомнения, как на самом деле читать / использовать ввод. Я решил загрузить весь ввод в одну строку, а затем работать с ней как с массивом и держать его индекс в качестве текущей позиции синтаксического анализа.

Не будет проблем с однобайтовым кодированием, но в многобайтовом кодировании каждое значение представляет не символ, а байт символа.

Пример:

$mb_string = 'žščř'; //4 multi-byte characters in UTF-8

for($i=0; $i < 4; $i++)
{
   echo $mb_string[$i], PHP_EOL;
}

Выходы:

Ĺ
ž
Ĺ
Ą

Это означает, что я не могу перебрать строку в цикле для проверки отдельных символов, потому что я никогда не знаю, нахожусь ли я в середине символа или нет.

Итак, вопросы:

  • Как мне прочитать многобайтовый сейф? один символ из строки в производительность дружественным образом?
  • Это хорошая идея работать с строка как массив в этом случай
  • Как бы вы прочитали ввод?

Ответы [ 3 ]

2 голосов
/ 07 апреля 2010

http://php.net/mb_string это то, что вы ищете

  • только символы mb_substr по одному
  • только до PHP6
  • какой именно ввод? Обычный способ вообще
1 голос
/ 07 апреля 2010
mb_internal_encoding("UTF-8");

$mb_string = 'žščř';

$l=mb_strlen($mb_string);

for($i=0;$i<$l;$i++){
    print(mb_substr($mb_string,$i,1)."<br/>");
}
0 голосов
/ 07 апреля 2010

Без использования mdb_relatedFunctions и с многобайтовыми кодированными строками вы можете использовать стандартные функции подстрок, которые считывают кратные байты, используемые для кодирования.

Например, для строки (2 байта) в кодировке UTF-8, если вам нужен первый символ из строки

$string = 'žščř'; //4 multi-byte characters in UTF-8

Вы должны получить значения $ string [0] AND $ string [1], чтобы вы действительно искали подстроку между индексами 0 и 1 (для первого символа).

Обратите внимание, что $ string [0] или $ string [N] будут ссылаться на первый (или N-й байт многобайтовой строки)

С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...