Как найти конкретный номер в строке php? - PullRequest
1 голос
/ 20 июня 2019

У меня есть разные строки, в которых я хочу найти конкретный номер.Если число находится внутри строки, оно должно напечатать это число.

Строки похожи на эти:

string(9) "path_12.0" 
string(9) "path_12.1" 
string(9) "path_13.0" 
string(9) "path_13.1" 
string(9) "path_13.2"

Числа похожи на:

int(12) 
int(12) 
int(13) 
int(13) 
int(13)

То, что я пытался это:

if (strpos(','.$mainString.',' , ','.$QuestionId.',') != FALSE) { 
        echo $QuestionId;
} // this doesn't print anything in the body

Я также попробовал следующий трюк, но он также ничего не печатает

if(in_array($QuestionId, explode(',', $mainString))) {
    echo $QuestionId;
}

Я хочу проверить что-то вроде этого:

if($questionId is in $mainString) { 
      echo $questionId;
}

Примечание: Я искал похожие вопросы в StackOverflow, но не нашел решения, которое решило бы мою проблему, поэтому я публикую этот вопрос.

Ответы [ 3 ]

2 голосов
/ 20 июня 2019

Другим вариантом может быть создание массива с вашими строками и использование preg_grep с шаблоном, который проверяет, равна ли первая часть десятичного числа одному из чисел.

Пример шаблона , где цифры из массива используются в качестве чередования:

_\K(?:12|13)(?=\.\d+)
  • _\K Подберите подчеркивание и забудьте, что было найдено
  • (?: Группа без захвата
    • 12|13 Соответствует 12 или 13
  • ) Закрыть группу без захвата
  • (?=\.\d+) Позитивный взгляд, утверждают, что справа находится точка и 1+ цифры

Например:

$numbers = [12, 13];
$strings = [
    "path_12.0",
    "path_12.1",
    "path_13.0",
    "path_13.1",
    "path_13.2",
    "path_14.1"
];

$pattern = "/_\K(?:" . implode('|', $numbers) . ")(?=\.\d+)/";
$resullt = preg_grep($pattern, $strings);
print_r($resullt);

Результат

Array
(
    [0] => path_12.0
    [1] => path_12.1
    [2] => path_13.0
    [3] => path_13.1
    [4] => path_13.2
)

Php демо

Или, если вы хотите напечатать только цифры, вы можете использовать array_reduce и собрать совпадения:

$result = array_reduce($strings, function($carry, $item) use ($pattern){
    if (preg_match($pattern, $item, $matches)){
        $carry[] = $matches[0];

    }
    return $carry;
});

print_r($result);

Результат

Array
(
    [0] => 12
    [1] => 12
    [2] => 13
    [3] => 13
    [4] => 13
)

Php демо

2 голосов
/ 20 июня 2019

Вы можете использовать ниже фрагмент,

$paths = ["path_12.0", "path_12.1", "path_13.0", "path_13.1", "path_13.2", ];
$nos = [12, 12, 13, 13, 13, ];
function strpos_arr($needle,$haystack)
{
    if (!is_array($haystack)) {
        $haystack = [$haystack];
    }
    foreach ($haystack as $what) {
        if (($pos = strpos($what,(string)$needle)) !== false) {
            return $pos;
        }

    }
    return false;
}
foreach ($nos as $key => $value) {
    // checking if question id in in path array with str pos
    if(strpos_arr($value,$paths) !== false){
        echo $value."\n";
    }
}

Демо .

1 голос
/ 20 июня 2019
$array_strings =  ["path_12.0", "path_12.1", "path_13.0", "path_13.1", "path_13.2"];
$array_numbers = [12, 22, 13, 11, 17];
$results = [];

foreach ($array_strings as $string){
  preg_match_all('!\d+\.*\d*!', $string, $matches);
  foreach ($array_numbers as $number){
      if (in_array($number, $matches[0])){
             array_push($results, $number);
         }
    }
}

print_r($results);

результаты: Array ( [0] => 12 [1] => 13 )

Примечание 1: ответы массива могут иметь повторяющиеся значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...