, &, " and --; the JS builder keeps non-ASCII raw) and with \uXXXX for * non-ASCII (WordPress' PHP serializer). Case-insensitive adds the lower and upper case * forms, since the hex digits of \u escapes do not fold. * * @return list */ public static function of(string $search, bool $caseSensitive): array { $variants = $caseSensitive ? [$search] : [$search, mb_strtolower($search), mb_strtoupper($search)]; $forms = []; foreach ($variants as $variant) { $escaped = substr(Serializer::attributes(['s' => $variant]), 6, -2); array_push($forms, $variant, $escaped, self::unicodeEscaped($escaped)); } return array_values(array_unique($forms)); } /** Whether block markup contains $search in one of its stored forms. */ public static function mentions(string $markup, string $search, bool $caseSensitive): bool { foreach (self::of($search, $caseSensitive) as $form) { $found = $caseSensitive ? str_contains($markup, $form) : mb_stripos($markup, $form) !== false; if ($found) { return true; } } return false; } /** Non-ASCII characters as JSON \uXXXX escapes (UTF-16, lower-case hex like json_encode()). */ private static function unicodeEscaped(string $value): string { return (string) preg_replace_callback('/[^\x00-\x7F]/u', static function (array $match): string { $units = unpack('n*', (string) mb_convert_encoding($match[0], 'UTF-16BE', 'UTF-8')); return implode('', array_map(static fn (int $unit): string => sprintf('\\u%04x', $unit), (array) $units)); }, $value); } }