Парсинг байтовой строки в PHP

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

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

Пример:

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

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

Выводы:

Ĺ
ž
Ĺ
Ą

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

Таким образом, вопросы:

  • Как делают меня многобайтовое безопасное чтение отдельный символ от строки в производительности дружественный путь?
  • Это - хорошая идея работать со строкой, поскольку это был массив в этом случае?
  • Как Вы считали бы вход?
6
задан Petr Peller 7 April 2010 в 08:36
поделиться

3 ответа

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

  • только символы mb_substr один за другим
  • не раньше PHP6
  • , какой именно ввод? Обычный способ вообще
2
ответ дан 17 December 2019 в 18:12
поделиться

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

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

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

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

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

с уважением,

0
ответ дан 17 December 2019 в 18:12
поделиться
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/>");
}
1
ответ дан 17 December 2019 в 18:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: