2016-11-21 9 views
2

Кто-нибудь знает, как написать регулярное выражение, что делает это:PHP: Regex, должен содержать все буквы из списка

скажем, у меня есть буквы в массиве как

$letters = array('a','b','a'); 

, а также у нас есть слово Алабама, и я хочу, чтобы preg_match возвращал true, так как он содержит букву A два раза и B. Но он должен возвращать false в слово Ab, потому что в этом слове нет двух A.

Любые идеи?

EDIT: единственный образец, который я попробовал, был [а, Ь, а], но она возвращает истину, на каждое слово, которое действительно содержит одно из этих писем, а также не проверяет его на несколько буквенных вхождений

+2

Будут ли будет содержимое массива в том же порядке, что и в строке? – nu11p01n73R

+0

@ nu11p01n73R нет .. они должны быть где-то в строке с одинаковым или большим числом вхождений – VespaQQ

+0

не могли бы вы очистить меня больше? что вы подразумеваете под словом «у нас есть слово Алабама?» попробуйте с помощью '^ aba \ z/gm', если aba исправлена, он будет работать. –

ответ

0

Must вы нужно использовать регулярные выражения? Даже если проблема может быть решена через них, код будет очень сложным. «Руководство» решение будет более четким и занимает линейное время:

function stringContainsAllCharacters(string $str, array $chars): bool 
{ 
    $actualCharCounts = array_count_values(str_split($str)); 
    $requiredCharCounts = array_count_values($chars); 
    foreach ($requiredCharCounts as $char => $count) { 
     if (!array_key_exists($char, $actualCharCounts) || $actualCharCounts[$char] < $count) { 
      return false; 
     } 
    } 
    return true; 
} 
1

Я думаю, что вы не должны усложнять процесс. Вы можете пройти letters и проверить, существует ли в word, если все письмо есть, верните true. Что-то вроде этого:

$letters = array('a','b','a'); 
$word = "Alabama"; 

function inWord($l,$w){ 
    //For each letter 
    foreach($l as $letter){ 
     //check if the letter is in the word 
     if(($p = stripos($w,$letter)) === FALSE) 
      //if false, return false 
      return FALSE; 
     else 
      //if the letter is there, remove it and move to the next one 
      $w = substr_replace($w,'',$p,1); 
    } 
    //If it found all the letters, return true 
    return TRUE; 
} 

И использовать его как это: inWord($letters,$word);

Пожалуйста, обратите внимание, что это чувствительно к регистру, если вам нужно это дело чувствительного заменить stripos на strpos