Моя строка выглядит так:
Response: 311768560
311768562
311768564
Я пытался:
$success_pattern="Response: ((\d+)[\n])*";
$response="Response: 311768560\n311768562\n311768564\n311768566";
preg_match("/$success_pattern/i", $response, $match);
Выход:
Array (
[0] => Response: 311768560 311768562 311768564
[1] => 311768564
[2] => 311768564
)
Мне нужен массив, содержащий все числа в качестве вывода:
array('311768560','311768562','311768564');
<?php
$string="Response: 311768560 311768562 311768564";
preg_match_all("/[\d]+/", $string, $matches);
print_r($matches);
Выход:
Array
(
[0] => Array
(
[0] => 311768560
[1] => 311768562
[2] => 311768564
)
)
Старайтесь не зацикливаться на конкретной функции, такой как preg_match()
, PHP предлагает несколько способов создания желаемого результата. Я покажу вам три разных подхода:
вход:
$response="Response: 311768560
311768562
311768564";
Способ № 1: explode()
с substr()
а также strpos()
(демонстрация)
$array=explode("\r\n",substr($response,strpos($response,' ')+1));
* обратите внимание, этот метод предполагает, что первая строка (Response
) является единственной нежелательной подстрокой и всегда первой. Так же \r
может не потребоваться в зависимости от вашей среды программирования. Это, пожалуй, самый быстрый из моего списка методов, потому что он не использует регулярные выражения, но он требует 3 вызова функции и одного приращения — не говоря уже о том, что это может быть слишком буквальным для вашего фактического варианта использования.
Способ № 2: preg_match_all()
(демонстрация)
$array=preg_match_all('/\d+/',$response,$out)?$out[0]:[];
Этот метод очень прямой, быстрый и требует минимального кода. Если есть какие-либо недостатки, они заключаются в том, что preg_match_all()
возвращает результат true | false и генерирует выходную переменную в виде многомерного массива. Чтобы изменить этот вывод в соответствии с вашими одномерными требованиями, я помещаю встроенное условие в конец функции, которая доставляет нужные данные в $array
,
Способ № 3: preg_split()
(демонстрация)
$array=preg_split('/[^\d]+/',$response,null,PREG_SPLIT_NO_EMPTY);
Эта функция ведет себя так же, как explode()
кроме того, он обладает силой регулярных выражений. Шаблон идентифицирует все нецифровые подстроки и использует их как «разделители» и разбивает строку на каждую из них. Для вашего ввода первым разделителем будет «Response:», затем символы новой строки после: «311768560» и «311768562». Красота preg_split()
является то, что он непосредственно обеспечивает одномерный массив, который вы ищете.
Выход:
Независимо от того, какой из вышеперечисленных методов вы используете, вы получите один и тот же правильный вывод: $array=array('311768560','311768562','311768564');
Если какой-либо из этих методов не соответствует вашему фактическому варианту использования, возможно, это продукт вашего $response
строка слишком отличается от данных примера, которые вы разместили здесь.
Используйте функцию Array_shift ()
<?php
$str = "Response: 311768560 311768562 311768564";
$s = explode(" ",$str);
$p = array_shift($s);
print_r($s);
?>
выход
Array (
[0] => 311768560
[1] => 311768562
[2] => 311768564 )