Цикл регулярных выражений и телефонный номер

#javascript #regex

#javascript #регулярное выражение

Вопрос:

Вот мой код, но я не могу отобразить другие числа, потому что я проиндексировал [0], и я не знаю, как я могу отобразить другие числа.

 Example string: "Hello, you can contact me at 0744224422 or 0192234422."

Result code : "Hello, you can contact me at <span>0744224422</span> or <span>0744224422</span>."
 

В этом примере: мой код заменит «0192234422» на 0744224422 «, что логично», но я бы хотел, чтобы он отображал 0192234422… Как я могу это сделать?

Спасибо

 let selector = document.querySelectorAll('.message > div > .chat');
    for (let index = 0; index < selector.length; index  ) {
        if (selector[index].innerText) {
            let text = selector[index].innerText;
            const regex = /(d[s-]?)?[([s-]{0,2}?d{3}[)]s-]{0,2}?d{3}[s-]?d{4}/gim;
            if (text.match(regex).length) {
                const newTexte = ` <span>${text.match(regex)[0].trim()}</span> `;
                selector[index].innerHTML = text.replace(regex, newTexte); 
            };
        }
    }
 

Ответ №1:

Если вы используете символ $ замены функции replace, он поместит туда правильный текст. Вместо trim того, чтобы просто заключать в круглые скобки часть вашего регулярного выражения, не содержащую пробелов, и эффективно позволять группе захвата становиться операцией обрезки.

 let selector = document.querySelectorAll('.message > div > .chat');
    for (let index = 0; index < selector.length; index  ) {
        if (selector[index].innerText) {
            let text = selector[index].innerText;
            const regex = /(d[s-]?)?([([s-]{0,2}?d{3}[)]s-]{0,2}?d{3}[s-]?d{4})/gim;
            if (text.match(regex).length) {
                const newTexte = ` <span class="red">$2</span> `;
                selector[index].innerHTML = text.replace(regex, newTexte); 
            };
        }
    } 
 .red {
  background: yellow
} 
 <div class="message">
  <div>
    <div class="chat">Hello, you can contact me at 0744224422 or 0192234422.</div>
  </div>
</div> 

Я попытаюсь привлечь внимание к разнице в регулярных выражениях ниже: (потому что я добавил один набор круглых скобок)

/(d[s-]?)?[([ s-]{0,2}?d{3}[)]s-]{0,2}?d{3}[s-]?d{4}/gim
 ( )
/(d[s-]?)?([([ s-]{0,2}?d{3}[)]s-]{0,2}?d{3}[s-]?d{4})/gim;

Комментарии:

1. Черт возьми, мне не нравится подход замены окружающим пространством, который использовался в исходном вопросе, потому что он вставляет пробел перед завершающим периодом. Но это отдельная проблема.

Ответ №2:

У вас есть два отдельных экземпляра селектора? Если нет, то селектор.длина всего 1, поэтому отображается только первое число. Вы можете отредактировать html, чтобы иметь более одного экземпляра селектора (и стиль с помощью display: inline, чтобы он не прерывался на новую строку), например:

 let selector = document.querySelectorAll('.message > div > .chat');
    for (let index = 0; index < selector.length; index  ) {
        if (selector[index].innerText) {
            let text = selector[index].innerText;
            const regex = /(d[s-]?)?[([s-]{0,2}?d{3}[)]s-]{0,2}?d{3}[s-]?d{4}/gim;
            if (text.match(regex).length) {
                const newTexte = ` <span>${text.match(regex)[0].trim()}</span> `;
                selector[index].innerHTML = text.replace(regex, newTexte); 
            };
        }
    } 
 <div class="message">
  <div>
    <p class="chat" style="display:inline">
      Hello, you can contact me at 0744224422 or </p>
    <p class="chat" style="display:inline">0192234422</p>
    <!-- add more numbers as needed in another <p class="chat" style="display:inline" ></p>-->
  </div>
</div> 

Ответ №3:

Спасибо за ваши ответы, но я просто хотел бы добавить <span></span> (или больше), когда в строке записан номер телефона..