How can rules be best defined in a bbCode-parser to ensure valid HTML output?

When defining rules in a bbCode-parser to ensure valid HTML output, it is important to carefully define the allowed bbCodes and their corresponding HTML tags and attributes. This can be done by creating a mapping of bbCodes to their corresponding HTML tags and attributes, and then validating the input against this mapping to ensure only valid bbCodes are converted to HTML.

// Define mapping of bbCodes to HTML tags and attributes
$bbCodeMapping = [
    'b' => ['tag' => 'strong'],
    'i' => ['tag' => 'em'],
    'u' => ['tag' => 'u'],
    'url' => ['tag' => 'a', 'attributes' => ['href']],
];

// Function to convert bbCode to HTML
function parseBBCode($input) {
    global $bbCodeMapping;
    
    // Regular expression to match bbCodes
    $pattern = '/\[([a-z]+)(?:=([^\]]+))?\](.*?)\[\/\1\]/';
    
    // Replace bbCodes with corresponding HTML tags and attributes
    return preg_replace_callback($pattern, function($matches) use ($bbCodeMapping) {
        $bbCode = $matches[1];
        $content = $matches[3];
        
        if (isset($bbCodeMapping[$bbCode])) {
            $tag = $bbCodeMapping[$bbCode]['tag'];
            $attributes = implode(' ', array_map(function($attr) use ($matches) {
                return $attr . '="' . $matches[2] . '"';
            }, $bbCodeMapping[$bbCode]['attributes'] ?? []));
            
            return "<$tag $attributes>$content</$tag>";
        } else {
            return $matches[0]; // Return original bbCode if not in mapping
        }
    }, $input);
}

// Example usage
$input = "[b]Bold text[/b] [i]Italic text[/i] [url=https://www.example.com]Link[/url]";
echo parseBBCode($input);