Fix linkify double-escaping URLs with protocols

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
root
2026-01-28 18:56:04 +00:00
parent ed9bf6f23c
commit 90efeab7ea
2 changed files with 39 additions and 16 deletions

View File

@@ -1659,14 +1659,26 @@ function _linkify_content(string $content, bool $new_window): string
return '<a href="' . $url . '"' . $target . '>' . $url . '</a>';
}, $content);
// Then, replace domain-like text (but not if already inside an href)
$content = preg_replace_callback($domain_pattern, function ($matches) use ($target) {
$domain = $matches[1];
// Clean trailing punctuation
$domain = rtrim($domain, '.,;:!?)\'\"');
// Don't linkify if it looks like it's already in an href attribute
return '<a href="https://' . $domain . '"' . $target . '>' . $domain . '</a>';
}, $content);
// Then, replace domain-like text only in segments NOT inside <a> tags
// (the URL replacement above may have created <a> tags)
$link_pattern = '/(<a\s[^>]*>.*?<\/a>)/is';
$segments = preg_split($link_pattern, $content, -1, PREG_SPLIT_DELIM_CAPTURE);
return $content;
$result = '';
foreach ($segments as $segment) {
// Skip segments that are already links
if (preg_match('/^<a\s/i', $segment)) {
$result .= $segment;
} else {
// Apply domain pattern to non-link segments
$result .= preg_replace_callback($domain_pattern, function ($matches) use ($target) {
$domain = $matches[1];
// Clean trailing punctuation
$domain = rtrim($domain, '.,;:!?)\'\"');
return '<a href="https://' . $domain . '"' . $target . '>' . $domain . '</a>';
}, $segment);
}
}
return $result;
}