powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP 5.4, preg_match_all и UTF-8
6 сообщений из 6, страница 1 из 1
PHP 5.4, preg_match_all и UTF-8
    #40032764
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть строка-шаблон, в которую на место переменных подставляются значения.
Примерно таким образом:
Код: php
1.
2.
3.
4.
5.
6.
...
	$find = <<<'REGEXP'
/(?<!\\)\{(:?[A-Z0-9_#]+?)(\|.+?)?(\@.+?)?\}/ui
REGEXP;
	if (!preg_match_all($find, $template, $mm, PREG_OFFSET_CAPTURE)) return $template;
...


Затем по найденным позициям я планирую выполнять substr_replace.
Проблема в том, что несмотря на модификатор u в массиве $mm смещения найденных переменных указываются не в символах, а в байтах. И это не считается багом .
Не подскажите, как это можно решить?
Полностью отойти от mb_* и использовать substr/strlen с заданием смещений и размеров в байтах?
...
Рейтинг: 0 / 0
PHP 5.4, preg_match_all и UTF-8
    #40032774
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В итоге сделал так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
	$template = $parts[0];
	$find = <<<'REGEXP'
/(?<!\\)\{(:?[A-Z0-9_#]+?)(\|.+?)?(\@.+?)?\}/i
REGEXP;
	if (!preg_match_all($find, $template, $mm, PREG_OFFSET_CAPTURE)) return $template;
...
	foreach ($mm[0] as $i=>$m)
	{
		$fld = ['pos'=>$m[1], 'len'=>_strlen($m[0]), 'var'=>_strtoupper($mm[1][$i][0])];
...
		$fld['pos'] = mb_strlen(mb_strcut($template, 0, $m[1]));
...
	}


Считает правильно, но выглядит как-то не очень.
...
Рейтинг: 0 / 0
PHP 5.4, preg_match_all и UTF-8
    #40032785
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Проблема в том, что несмотря на модификатор u в массиве $mm смещения найденных переменных указываются не в символах, а в байтах. И это не считается багом .
Хех, ясен пень, это не баг. Об этом русским языком по экрану монитора написано:https://www.php.net/manual/ru/function.preg-match-all.php PREG_OFFSET_CAPTURE

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


Alibek B.
Есть строка-шаблон, в которую на место переменных подставляются значения.
Глупый, возможно, вопрос. Функция preg_replace() в принципе не подходит для такой замены?
...
Рейтинг: 0 / 0
PHP 5.4, preg_match_all и UTF-8
    #40032788
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, preg_replace не подходит.
Во-первых непонятно, как эта функция будет работать с UTF-8.
Во-вторых, в строке-шаблоне может быть условный фрагмент (часть шаблона в квадратных скобках полностью пропускается, если внутри шаблона переменные не заданы), причем эти условные фрагменты могут быть вложенными, а регулярные выражения для подобного не подходят.
...
Рейтинг: 0 / 0
PHP 5.4, preg_match_all и UTF-8
    #40032794
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С utf-8 вполне нормально работает.
С хитрым форматом, согласен, не лучшее средство.
...
Рейтинг: 0 / 0
PHP 5.4, preg_match_all и UTF-8
    #40032805
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе условные фрагменты не основная проблема, я все равно разрезаю строку по этим фрагментам и обрабатываю их отдельно.
Но сейчас я одним регулярным выражением ищу все переменные, которые выглядят как <var|fmt@nvl>;. Затем прохожусь циклом по найденному и заменяю подстроку в зависимости от того, как указана переменная.
А если использовать preg_replace, то мне все-равно нужно будет найти все переменные, а затем для каждой найденной нужно будет делать отдельный preg_replace (потому что подставляемые значения отличаются), причем все это усложняется экранированием символов.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP 5.4, preg_match_all и UTF-8
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]