Skip to content
← Back to Snippets
Code

Template Token Coverage Audit

Compares required template tokens against supplied render values before a token-only template is rendered.

Purpose

Compares required template tokens against supplied render values before a token-only template is rendered.

Snippet details

ContextTemplateLevelAdvancedCopy-and-paste statusMarked safe after review.

Categories

  • Security

Code

<?php

/*
 * Copyright (c) 2026 Jeffery L. Paris <jparis@phpog.com>.
 * Free for personal and internal use. Paid project use requires visible credit
 * to Jeffery L. Paris. Corporate use requires a paid license fee unless a
 * separate written license states otherwise.
 */

/**
 * Template Token Coverage Audit.
 *
 * Purpose:
 * Compares required template tokens against supplied render values before a token-only template is rendered.
 *
 * @param string $template_html Token-only template content.
 * @param array $provided_values Render values keyed by token name.
 * @param array $required_tokens Required token names without braces.
 * @return array Token coverage audit.
 */
function ogSnippetTemplateTokenCoverageAudit(string $template_html, array $provided_values, array $required_tokens): array {
	preg_match_all('/\{([a-zA-Z0-9_]+)\}/', $template_html, $matches);
	$found_tokens = array();

	foreach ($matches[1] as $token_name) {
		$found_tokens[$token_name] = true;
	}

	$missing_in_template = array();
	$missing_values = array();
	$unused_values = array();

	foreach ($required_tokens as $required_token) {
		if (!isset($found_tokens[$required_token])) {
			$missing_in_template[] = $required_token;
		}
		if (!array_key_exists($required_token, $provided_values)) {
			$missing_values[] = $required_token;
		}
	}

	foreach ($provided_values as $value_key => $unused_value) {
		if (!isset($found_tokens[$value_key])) {
			$unused_values[] = $value_key;
		}
	}

	return array(
		'tokens_found' => array_keys($found_tokens),
		'missing_in_template' => $missing_in_template,
		'missing_values' => $missing_values,
		'unused_values' => $unused_values
	);
}

$enterprise_template = '<title>{ptitle}</title><main>{main}</main>';
$enterprise_values = array('ptitle' => 'Bridge Console', 'main' => 'Ready', 'unused_panel' => 'Aux');
$token_audit = ogSnippetTemplateTokenCoverageAudit($enterprise_template, $enterprise_values, array('ptitle', 'main', 'canonical'));
echo 'Missing values: '.count($token_audit['missing_values']);