Соответствует одному неизвестному параметру php (код Морзе Regex)

У меня есть функция, которая проверяет, соответствует ли строка (параметр) значениям в массиве и возвращает массив ключей возможностей

function find_possible_match( $criteria ) {

$possible_match = array();


$possibilities = array(
"a"=>".-",
"b"=>"-...",
"c"=>"-.-.",
"d"=>"-..",
"e"=>".",
"f"=>"..-.",
"g"=>"--.",
"h"=>"....",
"i"=>"..",
"j"=>".---",
"k"=>"-.-",
"l"=>".-..",
"m"=>"--",
"n"=>"-.",
"o"=>"---",
"p"=>".--.",
"q"=>"--.-",
"r"=>".-.",
"s"=>"...",
"t"=>"-",
"u"=>"..-",
"v"=>"...-",
"w"=>".--",
"x"=>"-..-",
"y"=>"-.--",
"z"=>"--..",
"0"=>"-----",
"1"=>".----",
"2"=>"..---",
"3"=>"...--",
"4"=>"....-",
"5"=>".....",
"6"=>"-....",
"7"=>"--...",
"8"=>"---..",
"9"=>"----.",
"."=>".-.-.-",
","=>"--..--",
"?"=>"..--..",
"/"=>"-..-.",
" "=>" ");


foreach ( $possibilities as $key => $value ) {

if( $value == $criteria ){
array_push(  $possible_match , $key );
}
}

return $possible_match;
}

это довольно стандартный, все критерии, где строка, как

find_possible_match( ".-" );

вернет [а] … и т. д.

но поворот в том, что, если в params есть неизвестный пример

find_possible_match("?");

должен вернуть [e, t], аналогично

find_possible_match("?.")

должен вернуть [‘i’, ‘n’] и

find_possible_match(".?")

должен вернуть [‘i’, ‘a’]

? в этом случае подстановочный знак.
Как мне изменить приведенный выше код, чтобы сделать именно это. Спасибо

2

Решение

Вы могли бы использовать preg_match() Вы проверяете, соответствуют ли критерии $ $value, Вы могли бы заменить $criteria в соответствии с требованиями регулярного выражения (escape-точка, convert ? в [.-]):

function find_possible_match( $criteria ) {

$criteria = str_replace(['.','?'],['\.','[.-]'],$criteria);
$regexp = '~^'.$criteria.'$~';

$possibilities = array(
"a"=>".-",
"b"=>"-...",
"c"=>"-.-.",
"d"=>"-..",
"e"=>".",
"f"=>"..-.",
"g"=>"--.",
"h"=>"....",
"i"=>"..",
"j"=>".---",
"k"=>"-.-",
"l"=>".-..",
"m"=>"--",
"n"=>"-.",
"o"=>"---",
"p"=>".--.",
"q"=>"--.-",
"r"=>".-.",
"s"=>"...",
"t"=>"-",
"u"=>"..-",
"v"=>"...-",
"w"=>".--",
"x"=>"-..-",
"y"=>"-.--",
"z"=>"--..",
"0"=>"-----",
"1"=>".----",
"2"=>"..---",
"3"=>"...--",
"4"=>"....-",
"5"=>".....",
"6"=>"-....",
"7"=>"--...",
"8"=>"---..",
"9"=>"----.",
"."=>".-.-.-",
","=>"--..--",
"?"=>"..--..",
"/"=>"-..-.",
" "=>" ");


$possible_match = array();
foreach ($possibilities as $key => $value) {
if (preg_match($regexp, $value)) {
array_push($possible_match, $key);
}
}
return $possible_match;
}

print_r(find_possible_match(".-")); // ['a']
print_r(find_possible_match("?")); // ['e','t']
print_r(find_possible_match("?.")); // ['i','n']
print_r(find_possible_match(".?")); // ['i','a']

Выходы:

Array
(
[0] => a
)
Array
(
[0] => e
[1] => t
)
Array
(
[0] => i
[1] => n
)
Array
(
[0] => a
[1] => i
)
4

Другие решения

Вы можете использовать фильтрацию массива и основные регулярные выражения, чтобы соответствовать $criteria аргумент:

<?php

function find_possible_match($criteria)
{

$possible_match = array();

$possibilities = array(
"a" => ".-",
"b" => "-...",
"c" => "-.-.",
"d" => "-..",
"e" => ".",
"f" => "..-.",
"g" => "--.",
"h" => "....",
"i" => "..",
"j" => ".---",
"k" => "-.-",
"l" => ".-..",
"m" => "--",
"n" => "-.",
"o" => "---",
"p" => ".--.",
"q" => "--.-",
"r" => ".-.",
"s" => "...",
"t" => "-",
"u" => "..-",
"v" => "...-",
"w" => ".--",
"x" => "-..-",
"y" => "-.--",
"z" => "--..",
"0" => "-----",
"1" => ".----",
"2" => "..---",
"3" => "...--",
"4" => "....-",
"5" => ".....",
"6" => "-....",
"7" => "--...",
"8" => "---..",
"9" => "----.",
"." => ".-.-.-",
"," => "--..--",
"?" => "..--..",
"/" => "-..-.",
" " => " ",
);

// If the criteria matches a possible morse code (including '.' and '-' only)
if(preg_match('~^[\.-]+$~', $criteria)) {

// Filters the array to match the criteria
$possible_match = array_filter($possibilities, function($value) use ($criteria) {
return $value === $criteria;
});

}

// If the criteria includes a wildcard
else if(preg_match('~[?\.-]~', $criteria)) {

// Creates a regular expression to match according to the given wildcards
// Each ? will match a single . or -
$regex = str_replace('.', '\.', $criteria);
$regex = str_replace('?', '[\.-]', $regex);
$regex = "~^{$regex}$~";

// Filters the array to match the criteria
$possible_match = array_filter($possibilities, function($value) use ($criteria, $regex) {
return preg_match($regex, $value);
});


}

// Return matches
return array_keys($possible_match);

}

// Test cases
$test = array(
'.-',
'?',
'?.',
'.?',
);

foreach($test as $criteria) {
print_r(find_possible_match($criteria));
}

Выход:

Array
(
[0] => a
)
Array
(
[0] => e
[1] => t
)
Array
(
[0] => i
[1] => n
)
Array
(
[0] => a
[1] => i
)
0

По вопросам рекламы [email protected]