PHP-функция для перебора строки и замены символов для всех возможных комбинаций

#php

#php

Вопрос:

Я пытаюсь написать функцию, которая заменит символы в строке их эквивалентом в кодировке HTML-объекта.

Я хочу, чтобы она могла перебирать все возможные комбинации для данной строки, например:

  • переходите по одному
  • затем комбинируйте, т. е. по 2 за раз, затем по три за раз, пока не получите длину за раз
  • затем начните с разделения комбо, т.е. первого и последнего, затем первого и предпоследнего
  • затем первые и последние два, первый и второй / третий по счету

Таким образом, для символов « abcd » это вернет:

 amp;#97;bcd
aamp;#98;cd
abamp;#99;d
abcamp;#100;
amp;#97;amp;#98;cd
aamp;#98;amp;#99;d
abamp;#99;amp;#100;
amp;#97;amp;#98;amp;#99;d
aamp;#98;amp;#99;amp;#100;
amp;#97;amp;#98;amp;#99;amp;#100;
amp;#97;bcamp;#100;
amp;#97;bamp;#99;d
  

и т. д………. и так далее, и тому подобное, пока не останется никаких других комбинаций

Есть идеи, или кто-нибудь где-нибудь видел функцию, которую я мог бы изменить для этой цели?

Комментарии:

1. Какого черта вам это могло понадобиться?

2. Это пахнет как ужасно неэффективный способ что-то сделать… Если вы скажете нам, чего вы пытаетесь достичь, тогда, возможно, мы сможем предложить что-то совершенно другое.

3. Если я не ошибаюсь, это, по сути, приглашение к DOS-атаке, если только размер строки не ограничен.

4. она предназначена для кодирования URL-адреса, поскольку каждый раз он должен быть уникальным. да, если бы это было на общедоступном сервере, это было бы идеальным приглашением для DOS-атаки

Ответ №1:

цикл от 0 до 2 ^ длина — 1. На каждом шаге, если n-й бит счетчика цикла равен 1, кодируйте N-й символ

 $str = 'abcd';

$len = strlen($str);

for($i = 0; $i < 1 << $len; $i  ) {
    $p = '';
    for($j = 0; $j < $len; $j  )
        $p .= ($i amp; 1 << $j) ? 'amp;#' . ord($str[$j]) . ';' : $str[$j];
    echo $p, "n";
}
  

Комментарии:

1. 1 Ооочень сексуально (если немного сложно следовать без сопроводительного комментария)

2. Это тоже очень приятно!! Я бы хотел, чтобы вы могли принять здесь раздельное решение, потому что я мог бы потратить весь день, переключаясь между вашим и konforce

Ответ №2:

Есть 2^n комбинации, так что это быстро станет огромным. Это решение будет работать только до тех пор, пока оно соответствует целочисленному размеру PHP. Но на самом деле, кого это волнует? Такая большая строка напечатает столько результатов, что вы потратите всю свою жизнь, просматривая их.

 <?php
$input = 'abcd';

$len = strlen($input);
$stop = pow(2, $len);

for ($i = 0; $i < $stop;   $i)
{
  for ($m = 1, $j = 0; $j < $len;   $j, $m <<= 1)
  {
    echo ($i amp; $m) ? 'amp;#'.ord($input[$j]).';' : $input[$j];
  }
  echo "n";
}
  

Комментарии:

1. Мне это нравится, да, в конечном итоге у него закончится объем памяти, но к тому времени он сгенерирует множество комбинаций, которые выполнят свою работу

Ответ №3:

Как насчет этого?

 <?php
function permutations($str, $n = 0, $prefix = "") {
   if ($n == strlen($str)) {
      echo "$prefixn";
      return;
   }

   permutations($str, $n   1, $prefix . $str[$n]);
   permutations($str, $n   1, $prefix . 'amp;#' . ord($str[$n]) . ';');
}

permutations("abcd");
?>