JS и регулярное выражение для замены чего-либо внутри double = mark - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь написать блог на страницах GitHub.Но GFM не поддерживает выделение текста, как это делает типография.Что я хочу сделать, так это сопоставить все (включая разрывы строк) между парой "==".Поэтому следующий текст должен быть выделен

Edit the ==Expression=
== & T==sa==ext to see matches.

и изменен на

Edit the <span class="highlight">Expression=
</span> & T<span class="highlight">sa</span>ext to see matches.

. Я спрашиваю, что

  1. Какое регулярное выражение я должен использовать дляматч?Я получил ={2}[^=]*={2}, но это не правильно.
  2. Есть ли какие-нибудь простые js, которые я могу сделать замену?Я хочу, чтобы мой сайт использовал как можно меньше JS.

Большое спасибо!

Ответы [ 5 ]

0 голосов
/ 22 декабря 2018

Вот полное решение моего вопроса: замените == окруженный текст на <span class="highlight"> </span>.

<!DOCTYPE html>
<html lang="en">
<style>
  .highlight {
    background-color: yellow
  }
</style>

<body>
  <p>
    == asddac == awdawd = awda ==wad == ==d==
  </p>
</body>
<script>
  document.body.innerHTML = document.body.innerHTML.replace(/==([\s\S]*?)==/g, "<span class=\"highlight\">$1</span>");
</script>

</html>
0 голосов
/ 20 декабря 2018

Вы также можете использовать следующее регулярное выражение:

={2}(.*?)(?<!==)={2}

использовать обратную ссылку на \1 и окружить его <span class="highlight"> и </span>.(однако Mark Meyer решение более прямое и лучшее, поскольку Lookbehinds доступны только в браузерах, поддерживающих стандарт ECMA2018)

Демонстрация: https://regex101.com/r/UaFVeh/1/

0 голосов
/ 20 декабря 2018

Используются ленивые квантификаторы и обратные ссылки.

==(.*?)== Regex101 demo

0 голосов
/ 20 декабря 2018

Вот, пожалуйста!Это решение с использованием сверхсекретных методов замены функций регулярных выражений.

var testString = "Edit the ==Expression=\n== & T==sa==ext to see matches.";
console.log(testString);
console.log(testString.replace(/={2}([^=]=?)*={2}/g, function(match){
    return match.replace("==","<span class=\"highlight\">").replace("==","</span>");
}));
0 голосов
/ 20 декабря 2018

Вы можете сделать это довольно чисто с помощью обратных ссылок и флага s:

let str = `Edit the ==Expression=
== & T==sa==ext to see matches.`

let tags = str.replace(/==(.*?)==/gs, '<span class="highlight">$1</span>')
console.log(tags)

Если вы работаете в среде, где флаг s еще не работает, вы также можете использовать [\s\S] для сопоставления текста, включая разрывы строк:

let str = `Edit the ==Expression=
== & T==sa==ext to see matches.`

let tags = str.replace(/==([\s\S]*?)==/g, "<span>$1</span>")
console.log(tags)
...