Javascript-форум (https://javascript.ru/forum/)
-   Opera, Safari и др. (https://javascript.ru/forum/css-html-browser/)
-   -   поиск текста на странице через Regex (https://javascript.ru/forum/css-html-browser/72377-poisk-teksta-na-stranice-cherez-regex.html)

sylvio 24.01.2018 20:37

поиск текста на странице через Regex
 
Добрый день.
Просматриваю большое количество научных статей через базы типа Scopus, где ссылки на оригинальные публикации представлены в виде DOI кода - 10.ХХХХ(Х)/bc.XXXXXX. При добавлении этого кода к гиперссылке http://dx.doi.org/<код DOI> происходит переход на страницу статьи.
Идея моя в том, чтобы написать скрипт, который сам бы Regex'ом находил код на станице и подставлял в ссылку.
Но загвоздка в том, как присвоить результат поиска переменной?
Отзовитесь, кто знает :)

рони 24.01.2018 20:56

Цитата:

Сообщение от sylvio
Но загвоздка в том, как присвоить результат поиска переменной?

непонятно с чем проблема?

Aetae 24.01.2018 22:11

Для себя можно так:
var selection = getSelection();
new Set(
  document.body.textContent.match(/\b10\.[^\/\s]+\/[^\/\s]+/g)
).forEach(
  match => {
    while(find(match)){
      var link = document.createElement('a');
      link.href = 'http://dx.doi.org/' + match;
      selection.getRangeAt(0).surroundContents(link);
    }
    selection.collapse(document.body);
  }
);
window.scrollTo(0, 0);

Если текст простой - можно обойтись перебором текстовых нод.
Если регулярка сложная - нужно добавить обработку случаев, когда одно совпадение находится в другом.)

рони 24.01.2018 23:06

window.find поиск строки в документе
 
Aetae,
не знал даже об этом :thanks:
https://developer.mozilla.org/en-US/...PI/Window/find
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>

  <script>
findString = function findText(text) {
  var a = window.find(text);
  alert("String \x22" + text + "\x22 found? " + a);
}
  </script>
</head>

<body>
<p>Apples, Bananas, and Oranges.</p>
<button type="button" onClick='findString("Apples")'>Search for Apples</button>
<button type="button" onClick='findString("Banana")'>Search for Banana</button>
<button type="button" onClick='findString("Orange")'>Search for Orange</button>1234

</body>
</html>

j0hnik 25.01.2018 00:49

document.body.innerHTML= document.body.innerHTML.replace(/\b10\.[^\/\s]+\/[^\/\s]+/gi,  '<a href="http://dx.doi.org/$&">$&</a>');

рони 25.01.2018 01:13

j0hnik,
убил страницу, если там были назначены обработчики.

j0hnik 25.01.2018 01:19

рони,
Пиф паф рони, айм киллер! :D

Aetae 25.01.2018 02:11

Цитата:

Сообщение от рони (Сообщение 476154)
Aetae,
не знал даже об этом :thanks:

Причём браузерописцы всё хотят его выпилить, а меж тем это пока единственный способ(не из 100500 строк) выбра текста на странице без учёта разметки. Подобный метод так и просится в спецификацию Range, но чего нет, того нет.

sylvio 25.01.2018 12:34

Спасибо всем за помощь!
В конечном виде код, который через букмарк запускаю на странице, такой (немного изменил паттерн поиска):

javascript: window.open( "http://doi.org/"+ document.body.textContent.match(/\b10\..{4}\/\S+\b/i))


Результат первого найденого DOI открывается в новом окне, что и требовалось.


Часовой пояс GMT +3, время: 21:40.