Как использовать регулярное выражение, чтобы не сопоставлять HTML-теги, внутри которых есть определенные теги?

У меня есть такая ссылка, которую я хочу сопоставить с регулярным выражением:

<a href = "tel:something">something</a>

Мне удалось сопоставить его с <a[^>]+tel:.*?>.*?</a>

Но я не хочу сопоставлять ссылки, внутри которых есть <span></span>:

<a href = "tel:[some_numbers]"><span class = "hello">Hello</span>[some_numbers]</a>

Я пытался использовать отрицательный просмотр (?!(</?span[^>]*>)), чтобы исключить <span></span>, но это не сработало. Мое регулярное выражение ниже:

/<a[^>]+tel:.*?>(?!(</?span[^>]*>)).*?</a>/ig

Javascript имеет встроенную поддержку XPath. Каков источник вашей строки HTML? Для регулярного выражения нет буквально нулевой причины, если вы не будете каким-то образом обрабатывать вывод text().

MonkeyZeus 14.12.2020 14:27

Спасибо, я посмотрю на XPath! Источник строки HTML: var content = document.documentElement.innerHTML;

DrMe 14.12.2020 14:39

Никогда не анализируйте html с помощью регулярных выражений. stackoverflow.com/questions/1732348/…

BcK 14.12.2020 14:44

@DrMe Понятно, посмотри мой ответ. Вы можете сразу перейти к строке var iterator.

MonkeyZeus 14.12.2020 14:46
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны сделать это с помощью XPath:

// Our HTML source
var s = `<a href = "tel:something">something1</a>
<a href = "tel:[some_numbers]"><span class = "hello">Hello1</span>[some_numbers]</a>
<a href = "tel:something">something2</a>
<a href = "tel:[some_numbers]"><span class = "hello">Hello2</span>[some_numbers]</a>
<a href = "tel:something">something3</a>
<a href = "tel:[some_numbers]"><span class = "hello">Hello3</span>[some_numbers]</a>`;

// Create a root div because XML requires a single root element
var div = document.createElement('div');

// Set the innerHTML to our string
div.innerHTML = s;

// Find <a> tags with no direct child <span> tag(s)
var iterator = document.evaluate('//a[not(span)]', div, null, XPathResult.ANY_TYPE, null);

// Set the iterator
var thisNode = iterator.iterateNext();

// Loop the iterator and log the node found
while (thisNode) {
  
  console.info(thisNode);
  
  thisNode = iterator.iterateNext();
}

https://jsfiddle.net/kad3ouqL/

Это должно дать:

<a href = "tel:something">something1</a>
<a href = "tel:something">something2</a>
<a href = "tel:something">something3</a>

@DrMe Отлично! Если это помогло вам решить вашу проблему, пожалуйста, отметьте мой ответ как принятый :)

MonkeyZeus 14.12.2020 15:01

Другие вопросы по теме