Expresión регулярный параграф sustituir <br> <br> por <p> </p>

Buenas. Estoy intentando hacer алгоритм de manera que cada 2 <br> seguidos se conviertan en un <p> </p>

Он conseguido hacer que solo una vez se convierta de <br> <br> <p> </p>. Pero cuando intento метр 2 <p> seguidos никакой se crean más parrafos.

Otra cosa es que estoy metiendo el texto que saco de las sustituciiones directamente en elemento.innerHTML. Lo que pasa es que tambien si escribo directamente elementos en el TEXTAREA estos se añaden. Hay también alguna manera de codificar este HTML despues de recibir el texto? Cual sería la mejor manera de hacer todo esto que quiero hacer?

El codigo de ejemplo sería el siguiente. Танго СИ el siguiente código HTML:

<p>
  Esto es un texto
  <br><br>Parrafo 1
  <br><br>Parrafo 2
  <br><br>Parrafo3
</p>

Se convierta en:

<p>
  <p>Parrafo 1</p>
  <p>Parrafo 2</p>
  <p>Parrafo 3</p>
</p>

Y partiendo del anterior codigo я gustaría poder hacer que dentro de cada parrafo cuando Хага lo siguiente:

<p>
  <p>Parrafo 1 <br><br>Nuevo parrafo</p>
  <p>Parrafo 2</p>
  <p>Parrafo 3<br><br>Subparrafo de 3</p>
</p>

Se convierta en:

<p>
  <p>Parrafo 1</p>
  <p>Nuevo parrafo</p>
  <p>Parrafo 2</p>
  <p>Parrafo 3</p>
  <p>Subparrafo de 3</p>
</p>

O que esos 2 parrafos vayan al final en vez de ir justo despues del parrafo надел estaba metidos sus

Комо он dicho он, conseguido crear 2 parrafos seguidos подставляет su texto interno, pero al crear el tercero se меня crean 2 BR, подставляет un texto dentro de uno de esos 2 parrafos. Luego cambié la expresión регулярный y ahora соло кри consigo que se 1 parrafo seguido.

Пластина En, никакие consigo dar не подставляют регулярный la expresión, возможный si es que es. Aquí el HTML y el javascript

HTML

<div>
    <h4>Escribe un texto cualquiera</h4>
    <textarea cols="60" rows="10">Lorem ipsum dolor sit amet, consectetur adipisicing elit. In, id, quidem ex quaerat dignissimos saepe molestias vero praesentium nostrum iste libero voluptatem quam maxime quos quod obcaecati quae dolor pariatur!</textarea>

    <p id="p1">Lorem ipsum dolor sit amet, consectetur adipisicing elit. In, id, quidem ex quaerat dignissimos saepe molestias vero praesentium nostrum iste libero voluptatem quam maxime quos quod obcaecati quae dolor pariatur!</p>
</div>

JavaScript

window.onload = function(){
  const p1 = document.querySelector("#p1");
  const textarea = document.querySelector("textarea");

  textarea.addEventListener("input", function(){
    let texto = this.value.replace(/\n/gi, "<br>");
    texto = texto.replace(/(.*<p>.*)*(?:<br(?:\s\/)?>){2}(.*)(<\/p>)*/gi, "$1$3<p>$2</p>");

    texto = texto.replace(/-{4,8}/g, "<hr>");

    p1.innerHTML = texto;

  });
}
3
задан 12.03.2017, 01:26
2 ответа

Позволь мне отвечать тебе сначала на вопрос regex, но avisÃ: ndote, что является неправильной стратегией, s¦lo из-за твоего комментария доводя до сведения, что он для этих простых случаев.

могут делать, что он совпал со всем текстом до тех пор, пока он не найдет какую-то из этих этикеток: <br><br> или </p>. А именно, стратегия, которую я предлагаю тебе, состоит в том, чтобы делать регулярный expresi¦n, который совпадал бы со всем текстом вне этикетки...

[^<>\s][^<>]*`

... до тех пор, пока он не найдет искавшие этикетки или конец текста.

[^<>\s][^<>]*(?:<(?:br\s*\/?>\s*<br\s*\/?|\/p[^>]*)>|$)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Главной идеи об этом захватывать текст, который интересует нас, и тратить приклеивает этикетку на них предварительная и последующая этикетка.

ESQUEMA DEL REGEX QUE ESTÁ MÁS ABAJO

Как видно, мы поместили между paréntesis все то, что мы хотим, чтобы он захватил, чтобы мочь поддерживать это во время реализации замены (с $1).


Expresi¦n регулировать:

/(?:<p[^>]*>\s*)?([^<>\s][^<>]*)(?:<(?:br\s*\/?>\s*<br\s*\/?|\/p[^>]*)>(?:\s*\n)?|$)/gi

funci¦n quedar¦ - в:

window.onload = function(){
    const textarea = document.querySelector("textarea");

    textarea.addEventListener("input", formatearParrafos);

    //Formatear al inicio también (sólo para esta demo)
    formatearParrafos();
}

function formatearParrafos(elem){
    const textarea = document.querySelector("textarea");
    let texto = textarea.value;

    texto = texto.replace(
        /(?:<p[^>]*>\s*)?([^<>\s][^<>]*)(?:<(?:br\s*\/?>\s*<br\s*\/?|\/p[^>]*)>(?:\s*\n)?|$)/gi,
        "<p>$1</p>\n"
    );

    texto = texto.replace(/-{4,8}/g, "<hr>");

    const p1 = document.querySelector("#p1");
    //p1.innerHTML = texto;
    p1.innerText = texto;  //innerText para mostrarlo en un PRE
}
<textarea cols="60" rows="5">
<p>
  <p>Parrafo 1 <br><br>Nuevo parrafo</p>
  <p>Parrafo 2</p>
  <p>Parrafo 3<br><br>Subparrafo de 3</p>
</p>
</textarea>

<pre id="p1"></pre>

, Но я настаиваю, есть много случаев, что romper¦-an этот patr¦n, и действительно ты recomendar¦, - чтобы это противостоять с DOM и реализовывать новый вопрос, с которым ты смог продвигаться.

6
ответ дан 24.11.2019, 10:37
  • 1
    Я разоряю идею. С expresió n, что saqué только меня достает уровень. Внутри следующих < p> он создает меня одинокий < br>. Он как будто он не был способен проникать má s я углубляюсь anidaciiones. Так или иначе я думаю, что я проник во что-то невозможное делания с регулярными выражениями а следовательно я вижу и segú n ты говоришь. Мой intenció n был той делания pequeñ или я форматирую через простое написание или заменяя какие-то вещи. Как способ мочь создавать элементы, не кодируя только используя клавиатуру. Один < p> там, один < hr> какой-то другой набор символов из-за специального характера и вещей así – Lorthas 12.03.2017, 03:06
  • 2
    как это, но что разорял все они < br> < br> внутри má s < p> < / p> вот тем, что он искал, но помещая новости < p> вне все. текст = texto.replace (/(?:< br> \s*< br>) (.*) [^< br>] * (< \/p>.*)*/gi," $2< p> $1< / p> "); – Lorthas 12.03.2017, 03:07
  • 3
    @Lorthas edité ответ, чтобы улучшать expresió n регулировать, и что совпал с, твой пример... - немного má s детали, хотя aú n querrí чтобы добавлять má s в ответ – Mariano 12.03.2017, 22:02

Хотя ответ наверху elegà - как ¦ptima, только я gustar¦ - в añadir opci¦n, который я открыл делая доказательства.

EstÃ: протестированный как в Mozilla, так и в Вивальди.

funci¦n с регулярным expresi¦n quedar¦ - в as¦-:

texto = texto.replace(/(<p>[^<\/>]*)*?(?:<br(?:[\S\s]*?\/)?>){2}/gi, "$1<p>") // Replace <br><br> with a <p> element.

, не закрыв этикетку < p> в sustituci¦n, браузеры закрывают ее автоматически, введя в innerHTML HTML с новостью sustituci¦n.

Это позволяет, что, создав новый параграф, было возможно продолжать писать внутри как будто мы двинули курсор внутри параграфа. seguirÃ: когда пишут в новом параграфе до тех пор, пока мы вновь не введем 2 < br> < br> последующие.

Так следующий HTML в тексте quedar¦ - в asà - поместив это в innerHTML уже быть замененный стоимость < br> < br>

, Не заменяя

<p>
  Hola
  <br>
  Mundo
  <br>
  <br>
  Parrafo 1
  <br>
  Salto linea parrafo 1
  <br>
  <br>
  Parrafo 2
  <br>
  Salto linea parrafo 2
</p>

Después заменения quedar¦ - в as¦-:

<p>
  Hola
  <br>
  Mundo
  <p>
    Parrafo 1
    <br>
    Salto de linea parrafo 1
  </p>
  <p>
    Parrafo 2
    <br>
    Salto linea parrafo 2
  </p>
</p>

, Хотя искать это поведение не закрытия этикеток, чтобы получать эту цель и какой-то другой конечно не будет mÃ: s показанный.

0
ответ дан 24.11.2019, 10:37