Php preg_replace_callback создает ложные записи в совпадениях для названных группPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Php preg_replace_callback создает ложные записи в совпадениях для названных групп

Сообщение Anonymous »

У меня есть пара блоков «шорткода» в тексте, который я хочу заменить на некоторые HTML -сущности на лету, используя preg_replace_callback .
Синтаксис короткого кода прост:

Код: Выделить всё

[block:type-of-the-block attribute-name1:value attribute-name2:value ...]
< /code>
Атрибуты с значениями могут быть предусмотрены в любом порядке. Образец режима режима я использую, чтобы найти эти блоки коротких кодов: < /p>
/\[
(?:block:(?piechart))
(?:
(?:\s+value:(?[0-9]+)) |
(?:\s+stroke:(?[0-9]+)) |
(?:\s+angle:(?[0-9]+)) |
(?:\s+colorset:(?reds|yellows|blues))
)*
\]/xumi
< /code>
Теперь, вот и смешная вещь: PHP соответствует несуществующим названным группам. Для такой строки, как это: < /p>
[block:piechart colorset:reds value:20]
.... Полученный массив $ matches (обратите внимание на пустые строки в "ход" и "angel" ):

Код: Выделить всё

array(11) {
[0]=>
string(39) "[block:piechart colorset:reds value:20]"
["block"]=>
string(8) "piechart"
[1]=>
string(8) "piechart"
["value"]=>
string(2) "20"
[2]=>
string(2) "20"
["stroke"]=>
string(0) ""
[3]=>
string(0) ""
["angle"]=>
string(0) ""
[4]=>
string(0) ""
["colorset"]=>
string(4) "reds"
[5]=>
string(4) "reds"
}
Вот код для тестирования (вы также можете выполнить его онлайн здесь: https://onlinephp.io/c/2429a):
$pattern = "
/\[
(?:block:(?piechart))
(?:
(?:\s+value:(?[0-9]+)) |
(?:\s+stroke:(?[0-9]+)) |
(?:\s+angle:(?[0-9]+)) |
(?:\s+colorset:(?reds|yellows|blues))
)*
\]/xumi";
$subject = "here is a block to be replaced [block:piechart value:25 angle:720] [block] and another one [block:piechart colorset:reds value:20]";
preg_replace_callback($pattern, 'callbackFunction', $subject);

function callbackFunction($matches)
{
var_dump($matches);

// process matched values, return some replacement...
$replacement = "...";

return $replacement;
};
< /code>
Нормально ли, что PHP создает пустые записи в массиве $ Matches, на случай матча, но не очищает его, когда не найдено фактического совпадения? Что я делаю не так? Как предотвратить создание PHP этих ложных записей, которых просто не должно быть? Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/728 ... med-groups
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»