What are some potential pitfalls when using strip_tags or htmlspecialchars in PHP for filtering HTML content?

When using strip_tags or htmlspecialchars in PHP for filtering HTML content, some potential pitfalls include not accounting for different character encodings, inadvertently removing necessary tags or attributes, and not properly sanitizing user input. To mitigate these risks, it's important to use these functions in combination with other filtering methods, such as validating input against a whitelist of allowed tags and attributes.

// Example of using strip_tags and htmlspecialchars with additional filtering methods
$allowed_tags = '<p><a><strong><em>'; // Define a whitelist of allowed tags
$allowed_attributes = array('href', 'title'); // Define a whitelist of allowed attributes

$input = '<p><a href="https://example.com" onclick="alert(\'XSS attack!\')">Click me</a></p>'; // User input

// Apply filtering
$filtered_input = strip_tags($input, $allowed_tags);
$filtered_input = htmlspecialchars($filtered_input);

// Validate against whitelist of allowed attributes
$filtered_input = preg_replace_callback('/<([a-z][a-z0-9]*)[^>]*>/i', function($matches) use ($allowed_attributes) {
    $tag = $matches[1];
    if (!in_array($tag, $allowed_attributes)) {
        return '<' . $tag . '>';
    }
    return $matches[0];
}, $filtered_input);

echo $filtered_input; // Output the sanitized input