RegEx для извлечения внутренней ссылки в теге привязки и добавления чего-либо в нее - PullRequest
0 голосов
/ 30 апреля 2019

Я разрабатываю блог рендеринга на стороне сервера с помощью Nuxt.js, я хочу добавить AMP-версию этого сайта.Если URL обычной страницы https://example.com/blog/internal-link, версия AMP будет https://example.com/amp/blog/internal-link.

. Я должен добавить префикс /amp для всей внутренней ссылки, прежде чем она отправит клиенту, если кто-то откроет AMP.версия.

У меня есть это регулярное выражение <a([^>]*?)href\s*=\s*(['"])([^\2]*?)\2\1*> для извлечения href-значения тега привязки.

Затем я придумал этот скрипт:

const regex = /<a([^>]*?)href\s*=\s*(['"])([^\2]*?)\2\1*>/gi;
const str = `<a href="/blog/internal-link" aria-label="Internal Link" class="blog__link">`;
const subst = `<a href="/amp$3>`;

const result = str.replace(regex, subst);

console.log(result);

Но приведенное выше регулярное выражение извлекает все значение href, включая внешнюю и внутреннюю ссылку.Как сделать так, чтобы RegEx соответствовал только внутренней ссылке, предположим, что внутренняя ссылка всегда выглядит так /blog/internal-link?

Итак, исходя из этого сценария, входные и ожидаемые выходные данные должны быть такими:

Вход: <a href="/blog/internal-link" aria-label="Internal Link" class="blog__link">

Выход: <a href="/amp/blog/internal-link" aria-label="Internal Link" class="blog__link">

Вход: <a href="https://example.com/blog/internal-link" aria-label="Internal Link" class="blog__link">

Выход: <a href="https://example.com/blog/internal-link" aria-label="Internal Link" class="blog__link">


ОБНОВЛЕНИЕ

Спасибо за помощь в решении этой проблемы.Я заканчиваю тем, что использую этот RegEx <a([^>]*?)href\s*=\s*(['"])(\/[^\2]*?)\2\1*>.Мне нужно только добавить \/ перед [^2]*?, чтобы отфильтровать внутреннюю ссылку.

Вот минимальное воспроизведение с окончательным результатом для моей задачи:

const html = `
<html>
    <head>
        <title>Hello World</title>
    </head>
    <body>
        <a href="/blog/internal-link" aria-label="Internal Link" class="blog__link">Internal Link</a>
        <a href="https://example.com/blog/external-link" aria-label="External Link" class="blog__link">External Link</a>
    </body>
</html>`

const regex = /<a([^>]*?)href\s*=\s*(['"])(\/[^\2]*?)\2\1*>/gi;

const result = html.replace(regex, `<a href="/amp$3">`);

console.log(result)

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Вы можете исправить это, убедившись, что /blog/internal-link является частью вашего регулярного выражения:

const regex = /<a([^>]*?)href\s*=\s*(['"])([\s\S]*)\/blog\/([\s\S]*)([^\2]*?)\2\1*>/gi;
const str = `<a href="https://example.com/blog/internal-link" aria-label="Internal Link" class="blog__link">`;
const subst = `<a href="$3/blog/amp/$4>`;

const result = str.replace(regex, subst);

console.log(result);
0 голосов
/ 30 апреля 2019

Вы можете использовать URL класс:

const href = str.match(/<a([^>]*?)href\s*=\s*(['"])([^\2]*?)\2\1*>/gi)[0]
const url = new URL(href, "http://example.com")
url.pathname = "/amp"+url.pathname

const newUrl = url.toString()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...