Как зациклить и построить IP-адрес - PullRequest
3 голосов
/ 20 марта 2019

Учитывая 1,1.%.%, Где% - это подстановочный знак, я хочу просмотреть все возможные IP-адреса.

До сих пор мне удавалось успешно заменить один% циклом, но когда я пытаюсь попытаться заменить 2, он просто заменяет его тем же номером. Ниже приведен код, который у меня есть на данный момент, любая помощь в том, как вставить этот второй цикл, чтобы получить второй%, будет принята с благодарностью.

Код:

var wildCount = inputSt.match(/\%/g)  //works out how many % are there
var newPlaceholder ='' 
for (var i = 0; i < wildCount.length; i++){
    newPlaceHolder =inputSt.split("%").join(i)
    for (var n = 0; n <=254; n++){
        newPlaceholder = inputSt.split("%").join(n)
     }
 }

Выходные данные: 1.1.0.0, затем 1.1.1.1 и т. Д.

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Эта версия anser использует рекурсию для создания IP-адресов.Он разделяется на десятичные дроби, а затем рекурсивно проходит по токенам, чтобы увидеть, являются ли они% или нет, и, если они будут, будет обменивать их на [0, tokenLimit], пока не исчерпает все возможности.

Радичтобы не взрывать браузер, я установил tokenLimit на 11, а не на 255. Комментарии были добавлены в логику для подробных объяснений.

var test = '1.1.%.%';
var tokens = test.split( '.' );
var tokenLimit = 11;

// start the recursion loop on the first token, starting with replacement value 0
makeIP( tokens, 0, 0 );

function makeIP ( tokens, index, nextValue ) {
  // if the index has not advanced past the last token, we need to
  // evaluate if it should change
  if ( index < tokens.length ) {
    // if the token is % we need to replace it
    if ( tokens[ index ] === '%' ) {
      // while the nextValue is less than our max, we want to keep making ips
      while ( nextValue < tokenLimit ) {
        // slice the tokens array to get a new array that will not change the original
        let newTokens = tokens.slice( 0 );
        // change the token to a real value
        newTokens[ index ] = nextValue++;
        
        // move on to the next token
        makeIP( newTokens, index + 1, 0 );
      }
    } else {
      // the token was not %, move on to the next token
      makeIP( tokens, index + 1, 0 );
    }
  } else {
    // the index has advanced past the last token, print out the ip
    console.log( tokens.join( '.' ) );
  }
}
1 голос
/ 20 марта 2019

Таким образом, вы не хотите увеличивать, разбивая символ '%'.Было бы лучше разделить по октету:

var octets = inputSt.split('.');

Там у вас есть октеты 0-3 (так как это массив).Затем вы можете сделать рекурсивный оператор if для проверки подстановочного знака и приращения по ходу работы.

for (var i = 0; i < octets.length; i++) {
   if (octets[i].match('%')) {
      Do some incrementing...
   }
}

Очевидно, этот код еще не закончен.Но это должно привести вас в правильном направлении.

подсказка - Вы хотите поддерживать 1-4 подстановочных знака.Поэтому, вероятно, лучше всего создать функцию, которая будет увеличивать один октет.Если октет не последний с подстановочным знаком, вы снова вызываете ту же функцию.Мясо этой функции ниже.Я позволю вам выяснить, где и как выполнить индивидуальное увеличение .:

function incrementOctet(octet) {
   if (octet < 3) {
      if (octets[octet + 1].match('%')) {
         incrementOctet(octet + 1);
      }
   }
}
...