Разбор многобайтовой строки в PHP

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

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

Пример:

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

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

Выходы:

Ĺ
ž
Ĺ
Ą

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

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

  • Как многобайтовое безопасное чтение одиночный символ из строки в удобный способ?
  • Хорошо ли работать с string, поскольку это был массив в этом случай?
  • Как бы вы прочитали ввод?

Ответ 1

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

  • просто символы mb_substr по очереди
  • не до PHP6
  • какой ввод точно? Обычный способ вообще

Ответ 2

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/>");
}

Ответ 3

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

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

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

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

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

С уважением,