【问题标题】:Extract ISBN numbers from text从文本中提取 ISBN 编号
【发布时间】:2016-09-10 06:38:55
【问题描述】:

此 Javascript 从 HTML 表单中获取 ISBN(10-13 位数字)列表,并为每个列表打开一个新选项卡,在该选项卡中启动亚马逊上的搜索请求。在表格中输入的 ISBN 有一个换行符,每个 ISBN 旁边都有其书籍条件描述。

我需要 Javascript 来搜索 JUST ISBN 并在启动亚马逊搜索之前修复任何格式,因此它不会破坏搜索。

在下面的表单示例中,它需要搜索这三个 ISBN:0321973615、0 321 973 615(不带空格)和 0321973615。它包括空格、额外的数字,如“12-15 页,25%”,以及不得搜索所有多余的词,因为它们会破坏搜索。

0321973615 12-15 pages highlighted
0 321 973 615 good condition
13:0321973615 25% highlighting

小提琴:https://jsfiddle.net/09vfmhep/1/

//the input box.
var input = document.getElementById('numbers');



//adding an event listener for change on the input box
input.addEventListener('input', handler, false);

//function that runs when the change event is emitted
function handler () {
  var items = input.value.replace(/\s/g, '').replace(/\r?\n/g, ' ').split(' ');
      length = items.length;
  console.log('your collection', items);
  for (var i = 0; i < length; i++) {
    if ( items[i] && !isNaN(items[i])  ) {
      console.log('opening page for isbn ', items[i])
      openPage(items[i]);
    }
  }
}

//opens the tab for one isbn number
function openPage (isbn) {
  var base = 'https://www.amazon.ca/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords='
  window.open(base + isbn)
}
<h1>Amazon Bulk ISBN Search</h1>
<p>... note, after paste you may need to click outside the text area or tab out to fire the change event.</p>

<textarea id=numbers placeholder="paste isbn numbers as csv here">
</textarea>

如何从文本中提取 ISBN 编号,不带任何空格?

【问题讨论】:

  • 问题是什么
  • 不好。您正在做的是总体描述您的业务问题。但是,您应该努力过滤掉与您面临的问题无关的信息,并且非常简洁和明确地说明问题是什么以及您无法解决什么。列出您尝试过的方法以及失败的原因。

标签: javascript regex


【解决方案1】:

你可以使用代码:

function handler () {
    var items = input.value.match(/\b(\d\s*?){10,13}\b/gm);
    console.log('your collection', items);
    items.forEach(function (item) {
        item = item.replace(/\D+/g, '');
        console.log('opening page for isbn ', item)
        openPage(item);
    });
}

注意:在输入事件触发时打开窗口是个坏主意。如果开始在文本区域中输入,这会给用户带来非常糟糕的体验。大多数浏览器也会在打开其他类似的窗口之前发出警告。

相反,您可以生成超链接,仅当用户单击它们时才会打开其他选项卡。链接指向 example.com。用你需要的替换它。

这是一个可以做到这一点的 sn-p:

//the input box.
var input = document.getElementById('numbers');
var output = document.getElementById('output')
var base = 
    'https://www.example.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords='

//adding an event listener for change on the input box
input.addEventListener('input', handler, false);

//function that runs when the change event is emitted
function handler () {
  var items = input.value.split(/\b((?:\d\s*?){10,13})\b/gm);
  // Build DOM for output
  var container = document.createElement('span');
  items.map(function (item, index) {
    if (index % 2) { // it is the part that matches the split regex:
      var link = document.createElement('a');
      link.textContent = item.trim();
      link.setAttribute('href', base + item.replace(/\D+/g, ''));
      container.appendChild(link);
    } else { // it is the text next to the matches
      container.appendChild(document.createTextNode(item))
    }
  });
  // Replace output
  output.innerHTML = '';
  output.appendChild(container);
}
handler(); // run on load
<div><b>ISBN Hyperlinker</b></div>
<textarea id=numbers placeholder="paste isbn numbers as csv here" style="width:100%">
0321973615 12-15 pages highlighted
0 321 973 615 good condition
13:0321973615 25% highlighting
</textarea>
<div><b>Hyperlinked text:</b></div>
<div id="output" style="white-space: pre"></div>

在帧中运行

如果在框架中加载某些搜索网站,它们将不会呈现。您可以通过在代码中添加以下行来指示它们应该在新窗口/标签中打开:

      link.setAttribute('target', '_blank');

这在 SO sn-ps 中不起作用,所以我把它省略了。

关于 ISBN 格式

上面使用的正则表达式回答了您的问题10-13 位数字,但如 cmets 中所述,ISBN 代码可能以 X 结尾。请参阅this answer,其中包括更复杂的正则表达式,同时考虑到潜在的最终X

【讨论】:

  • 我喜欢你所做的。唯一的问题是 var base 不适用于 Amazon 搜索:"var base = "amazon.ca/s/…""
  • 那是因为该网站不想在框架内运行。如果您通过在链接上设置目标属性将其强制到另一个窗口/选项卡,它可以工作:jsfiddle.net/nwmopbho/4。我也把它放在答案中。
  • 请注意,"X" 是 ISBN-10 中的有效 ISBN 字符。有关识别有效 ISBN 编号的更多详细信息,请参阅 this answer (php) 或 wikipedia
  • trincot,有什么方法可以联系到你吗?我正在尝试扩展此代码并希望看到您的见解! :)
  • 我们可以试试这个聊天室:chat.stackoverflow.com/rooms/124182/speer-trincot
猜你喜欢
  • 2022-11-19
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 2015-08-02
  • 2012-10-16
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
相关资源
最近更新 更多