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 шт):
$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 будет количество найденного.
В общем задача решилась следующим образом (уверен, подобное решение очевидно для знающих людей и пишется быстрее, чем найти и прикрепить ссылку на документацию):
$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;
Признаться, решил интуитивным образом, так и не разобравшись в сути, к сожалению