首页 > 解决方案 > 循环函数查找 14 位数字并为这些结果运行脚本 - Javascript

问题描述

前言:我有两个文本区域。我想粘贴未格式化的电话号码列表以生成特定格式的电话号码列表。我想出了如何删除破折号、逗号、空格和字母来生成我需要的格式。(我让它添加一个逗号和一个空格并删除最后一个逗号仅供参考)

问题:下面的当前代码按 .replaces 的顺序运行良好。我试图将它们组合在一起,但在某些示例中效果不佳,但将其分解,使其按该顺序流动似乎可行。但是,我经常有范围的电话号码。因此,如果您有 555-555-5555 - 5556,它将输出 55​​555555555556。14 个字符!我想知道是否有办法在运行此公式后“找到”这 14 个字符,并使用我想出的另一个代码(在下面的代码下方)输出这些数字的范围。我将在下面发布两个代码并完成我的想法。理想情况下,我想结合这两个公式。

<script language="javascript" type="text/javascript">
function textremv() {
let output = Array.from(
    new Set(
        document.getElementById("content").value
        .replace(/,/g, "") // replace commas with nothing
        .replace(/\n/g, ",\n") //replaces new lines with comma and new line
        .replace(/\s|-/g, "") // replaces space and dash with nothing
        .replace(/[{()}]/g,"") //replaces all special characters with nothing
        .replace(/[a-zA-Z]/g, "") //replaces a-z with nothing
        .replace(/,/g, ",\n") //replaces comma with comma linebreak
        
        
        .split(',')
        
        

    )
).join(", ");
document.getElementById("content2").innerHTML = output + " "; //adds space at the end

}

// [0-9]{10}-[0-9]{4} 
}
function ct() {
  /* Get the text field */
  var copyText = document.getElementById("content2");

  /* Select the text field */
  copyText.select();
  copyText.setSelectionRange(0, 99999); /*For mobile devices*/

  /* Copy the text inside the text field */
  document.execCommand("copy");

  /* Alert the copied text */
  alert("Copied the text: " + copyText.value);
  /* <input type='button' value='Extract Text2' onclick='sortvalues(0);ct()'/> */
}
</script>

<form name="sorter">
<textarea rows='10' cols='20' id='content'></textarea>
<textarea rows='10' cols='20' id='content2'></textarea>
<input type='button' value='Extract Text' onclick='textremv();ct()'/>


</form>
<div id="output"></div>

单一范围适用于以下代码,例如 5555555555-5556 将列出列出的两个电话号码。

<script language="javascript" type="text/javascript">
function listrange(){
var range = document.getElementById("listrange1").value
var range1 = range.slice(0,10);
var range2 = range.slice(0,7) + range.slice(12,15);
var text = "";
var i = range1;
while (i <= range2) {
  text += i + ", ";
  i++;
}
document.getElementById("listrange2").innerHTML = text;
}

</script>

<textarea rows='10' cols='20' id='listrange1'></textarea>
<textarea rows='10' cols='20' id='listrange2'></textarea>
<input type='button' value='Extract Text' onclick='listrange()'/>

摘要:我不确定是否有一种方法可以组合公式来获取这 14 个字符,然后针对我在那里的第二个脚本运行它以生成电话号码范围列表。

示例如下:

555-555-5555 123-456-7890-7891 555-555-5506

应返回以下输出:5555555555、1234567890、1234567891、5555555506

我只是不确定如何让它回溯并寻找这 14 个字符来应用该循环功能。

先感谢您!

编辑:斯科特的回答有效!!如果您遇到这个问题并且像我一样缺乏经验,这里有完整的代码供您使用。此代码假定您提供 10 位电话号码或 4 位范围的 10 位电话号码。例如:1234567890 或 1234567890-7899

<textarea rows='6' cols='50' id='listrange1'></textarea>
<textarea rows='6' cols='50' id='listrange2'></textarea>
<br>
<button id='extract' >Extract Phone Numbers</button>
 
 <script type="text/javascript">
const getRange = (str) => {
  const [_, intro, start, end] = str .match (/(\d{6})(\d{4})(\d{4})/)
  return Array.from({length: end - start + 1}, (__, i) => intro + String(+start + i).padStart(4, '0'))
}

const phoneNumbers = str => 
  str .split (/[,\s]+/)                    // break on commas and/or spaces
    .map (str => str .replace (/\D/g, '')) // remove non-digits
    .filter (Boolean)                      // remove empties
    .filter (str => str .length == 10 || str.length == 14)
    .flatMap (str => str .length == 14 ? getRange(str) : [str])

document.getElementById('extract').onclick = (evt) => 
  document.getElementById('listrange2').innerHTML = 
    phoneNumbers(document.getElementById('listrange1').value).join('\n')
    </script>

可搜索关键字:Javascript、电话号码、范围、电话号码范围、客户端、循环

标签: javascripthtml

解决方案


这是一个没有真正查看您的代码而是从头开始编写的版本:

const getRange = (str) => {
  const [_, intro, start, end] = str .match (/(\d{6})(\d{4})(\d{4})/)
  return Array.from(
      {length: end - start + 1}, 
      (__, i) => intro + String(+start + i).padStart(4, '0')
  )
}

const phoneNumbers = str => 
  str .split (/[,\s]+/)                    // break on commas and/or spaces
    .map (str => str .replace (/\D/g, '')) // remove non-digits
    .filter (Boolean)                      // remove empties
    .filter (str => str .length == 10 || str.length == 14)
    .flatMap (str => str .length == 14 ? getRange(str) : [str])

const text = `First is 555-555-5555, more here: 123-456-7890-7893,
and a range starting at 0: 555-666-0000-0004
and another two: 555-555-5506 and 202-456-1414` 
                                  // ^-- (White House switchboard, if you need it)

console .log (phoneNumbers (text))

  • getRange接受一个 14 位的字符串并创建该范围内的所有电话号码。(没有错误检查范围的结尾高于开头;您可能想要添加它。)

  • phoneNumbers将字符串分成空格字符和逗号处的块,从每个结果字符串中删除所有非数字字符,删除现在为空的任何字符串,然后getRange用于 14 位数的字符串。它用于flatMap获取普通电话号码及其返回的数组并将它们getRange展平为单个列表。

您可能需要进一步filter删除长度不是 10 或 14 的数字。这可能会在flatMap通话之前进行。

更新:与文本区域一起使用

这会在一个文本区域中捕获信息并在按下按钮时提取电话号码:

const getRange = (str) => {
  const [_, intro, start, end] = str .match (/(\d{6})(\d{4})(\d{4})/)
  return Array.from(
      {length: end - start + 1}, 
      (__, i) => intro + String(+start + i).padStart(4, '0')
  )
}

const phoneNumbers = str => 
  str .split (/[,\s]+/)                    // break on commas and/or spaces
    .map (str => str .replace (/\D/g, '')) // remove non-digits
    .filter (Boolean)                      // remove empties
    .filter (str => str .length == 10 || str.length == 14)
    .flatMap (str => str .length == 14 ? getRange(str) : [str])

document.getElementById('extract').onclick = (evt) => 
  document.getElementById('listrange2').innerHTML = 
    phoneNumbers(document.getElementById('listrange1').value).join('\n')
<button id='extract' style="float:right">Extract Phone Numbers</button>
<textarea rows='6' cols='50' id='listrange1'>First is 555-555-5555, 
more here: 123-456-7890-7893, 
and another two: 555-555-5506 and 202-456-1414
and a range starting at 0: 555-666-0000-0004</textarea>
<textarea rows='6' cols='50' id='listrange2'></textarea>


推荐阅读