preg_match_all выводит количество совпадений вместо результата

Регулярка ищет совпадения по "цифра+мм", находит их

$diametr = '<div>металл толщиной 15 мм 2 мм 3мм</div>';

$diametr_result  = preg_match_all('/[0-9\.\,]+(?=\s?мм)/ui', $diametr, $diametr_result);
$diametr_result = preg_replace('/[^0-9\,\.]/', " ", $diametr_result);

echo $diametr_result;

Но выводит не найденные числа, а количество найденных совпадений по шаблону. Почему так? Как вывести найденные значения а не их количество?

В данном случае результат выдает просто "3" (кол-во совпадений). А нужно вывести "15 2 3"


Ответы (2 шт):

Автор решения: Roman Bush

$diametr_result = preg_match_all('/[0-9\.\,]+(?=\s?мм)/ui', $diametr, $diametr_result);

Смотри, что ты делаешь в этой строке: ты передаёшь ссылку на переменную $diametr_result в функцию preg_match_all (третий параметр). Смотрим документацию и видим, что третьим параметром надо передать переменную, в которую будут записаны результаты работы функции.

А потом ты берёшь и присваиваешь этой же переменной то, что функция вернёт. Смотрим, опять же, документацию, и читаем, что функция возвращает количество найденных вариантов.

То есть - сначала в эту переменную записывается то, что функция нашла. А потом (результат-то у нас возвращается ПОСЛЕ работы функции. То есть - сначала работает функция, что-то там делает и в процессе своей работы записывает в переменную то, что нашла) в эту же переменную записывается то, что функция вернула.

В общем, самое простое, что ты можешь сделать:

preg_match_all('/[0-9\.\,]+(?=\s?мм)/ui', $diametr, $diametr_result);

Это перестать перезаписывать результат, который тебе функция записала в переменную. Ну а если тебе нужно количество - то записывать это в другую переменную:

$diametr_count_result = preg_match_all('/[0-9\.\,]+(?=\s?мм)/ui', $diametr, $diametr_result);

И тогда в $diametr_result будет то, что функция нашла, а в $diametr_count_result будет количество найденного.

→ Ссылка
Автор решения: Amsterdam

В общем задача решилась следующим образом (уверен, подобное решение очевидно для знающих людей и пишется быстрее, чем найти и прикрепить ссылку на документацию):

$diametr = '<div>металл толщиной 15 мм 2 мм 3мм</div>';

$diametr  = preg_match_all('/[0-9\.\,]+(?=\s?мм)/', $diametr, $diametr_result); 
$diametr_result = implode(" ", $diametr_result[0]);

echo $diametr_result;

Признаться, решил интуитивным образом, так и не разобравшись в сути, к сожалению

→ Ссылка