2010-04-07 2 views
6

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

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

Пример:

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

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

Выходы:

Ĺ 
ž 
Ĺ 
Ą 

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

Так вопросы:

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

ответ

2

http://php.net/mb_string это вещь, которую вы не ищете

  • только mb_substr символы один за другим
  • не до PHP6
  • , что вход точно? Обычный способ в общем
+2

Обратите внимание, что раздел комментариев для 'mb_split' есть много примеров того, как разбить многобайтную строку на массив символов - например, http://us2.php.net/manual/en/function.mb-split.php#80046 – Amber

+0

@ Dav Я не знаю, Думаю, ему действительно нужен массив. –

+0

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

1
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

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

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

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

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

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

пожеланий,

+0

Не было бы трудно узнать, сколько байтов я должен прочитать? Это тривиальный пример, но в целом я не знаю, какие символы находятся на входе (символы UTF-8 могут иметь длину 1-4 байта). –

+0

Да, вам нужно определить, сколько байтов используется, но это ответ, который может дать вам некоторую информацию об использовании функций NON mb_related и манипулировать многобайтовыми строками. Надеюсь, вы найдете ее полезной. – Andreas

+0

Этот ответ вводит в заблуждение, поскольку он предполагает, что все символы UTF-8 имеют длину 2 байта. Когда на самом деле длина байта зависит от представленного символа. Как отметил @PetrPeller в комментарии выше, символы UTF-8 могут занимать всего 1 байт или целых 4 байта. – Lee

Смежные вопросы