2016-02-03 2 views
2

Есть ли способ получить какой-то XPATH для каждого слова, которое соответствует заданному регулярному выражению? Я имею в виду слова, отображаемые навигатором для пользователя. Таким образом, я мог бы манипулировать HTML, соответствующим каждому слову в отдельности.Получить XPATH слов HTML, которые соответствуют регулярному выражению

+1

Самое простое решение, я могу думать о том, будет использовать JQuery в [ ': содержит()'] селектор (https://api.jquery.com/contains-selector/). Конечно, это только если вы используете jQuery. – Hatchet

+1

Видимый, в отличие от чего? Что вы подразумеваете под «DOM path»? Вы имеете в виду выражение типа XPath? Что вы собираетесь с этим делать? Кстати, фрагменты текста, такие как слово, не адресуются никакими средствами, будь то XPath или селектор CSS. Оба адресованы только ** элементам **. –

+0

@torazaburo да, я имею в виду это. Что делать, если я разбираю слова и преобразую их в элементы? Будет ли это слишком много времени? – mochomecha

ответ

1

There's not a unique XPath to a node, но вот решение, которое использует функцию cssPath от this answer, чтобы вернуть путь к CSS элемента, содержащего текст, соответствующий регулярному выражению.

var cssPath = function(el) { 
 
    if (!(el instanceof Element)) 
 
    return; 
 
    var path = []; 
 
    while (el.nodeType === Node.ELEMENT_NODE) { 
 
    var selector = el.nodeName.toLowerCase(); 
 
    if (el.id) { 
 
     selector += '#' + el.id; 
 
     path.unshift(selector); 
 
     break; 
 
    } else { 
 
     var sib = el, 
 
     nth = 1; 
 
     while (sib = sib.previousElementSibling) { 
 
     if (sib.nodeName.toLowerCase() == selector) 
 
      nth++; 
 
     } 
 
     if (nth != 1) 
 
     selector += ":nth-of-type(" + nth + ")"; 
 
    } 
 
    path.unshift(selector); 
 
    el = el.parentNode; 
 
    } 
 
    return path.join(" > "); 
 
} 
 

 
var startElem = document.body; 
 
var items = startElem.getElementsByTagName("*"); 
 
for (var i = items.length; i--;) { 
 
    var match = items[i].innerHTML.match(/fox/); 
 
    if (match) { 
 
    var matched = document.createElement('div'); 
 
    matched.innerHTML = cssPath(items[i]); 
 
    document.getElementById("matches").appendChild(matched); 
 
    } 
 
}
<div>The quick brown fox</div> 
 
<div>jumped over the lazy dog.</div> 
 
<div>The slow orange ocelot</div> 
 
<div>crawled under the quick fox.</div> 
 
<hr> 
 
<h4>Matches /fox/</h4> 
 
<div id="matches"></div>

Смежные вопросы