Как преобразовать хештеги в HTML документе в ссылки, оставив без изменений хештеги внутри фрагментов кода?

Как заменить хештеги на ссылки в тексте статьи в формате HTML, исключая фрагменты кода, которые также могут содержать элементы, начинающиеся с #?
  • 1 марта 2024 г. 5:58
Ответы на вопрос 2
Для преобразования хештегов в HTML документе в ссылки, оставив без изменений хештеги внутри фрагментов кода, можно воспользоваться регулярными выражениями. 

Пример кода на JavaScript:

```javascript
// Преобразование хештегов в ссылки
function transformHashtagsToLinks(html) {
    // Находим все хештеги, кроме тех, которые находятся внутри фрагментов кода
    return html.replace(/<\/code>|(^|[^a-zA-Z0-9_])#(\w+)/g, function(match, prefix, hashtag) {
        // Проверяем, есть ли до хештега тег code
        if (prefix === '<code>') {
            return match; // Оставляем хештег без изменений
        } else {
            return prefix + '<a href="https://example.com/hashtag/' + hashtag + '">#' + hashtag + '</a>';
        }
    });
}

// Пример использования
var html = `
    <p>This is a #test paragraph with a <code>#hashtag</code>.</p>
    <p>Another #example: #test.</p>
`;

var transformedHtml = transformHashtagsToLinks(html);
console.log(transformedHtml);
```

Этот код найдет все хештеги в тексте HTML, кроме тех, которые находятся внутри фрагментов кода (обозначенных тегом `<code>`), и заменит их на ссылки. Если хештег находится внутри тега `<code>`, он останется без изменений.

Чтобы применить этот код к HTML документу, можно использовать библиотеку для работы с DOM, такую как `jsdom` или `cheerio`.
как-то так (не проверено и скорее всего не совсем оптимально; разбиение закрывающего code для сайта): 
$text = preg_replace_callback('~<code[^>]*>.*?</'.'code>|#(\w+)~uim', fn($m) => $m[0][0] === '<' ? $m[0] : "<a href=\"#{$m[1]}\">{$m[1]}</a>", $text);
Похожие вопросы