Получить только одно совпадение строки
Находим числа, после которых стоит "м".
$dlina = "420м 100г и 400м 100г";
$str_dlina = preg_match_all("/\d+\s(м)\b|\d+(м)\b|\d+\s(метров)\b|\d+(метров)\b/iu", $dlina, $out);
$dlina = implode(', ', $out[0]);
echo $dlina_result = preg_replace('/[^\d]/', '', $dlina);
В результате получаем "420 400" (т.е. функция находит два числа, после которых стоит "м").
А как получить только одно число, например, лишь первое совпадение? (тут 420)
Ответы (2 шт):
Автор решения: Eugene X
→ Ссылка
В твоём случае наверно вот такой результат ожидал?
$matches[0] после map первое совпадение, [1] второе и.т.д.
<?php
$dlina = '420м 100г и 400м 100г';
$re = '/\d+м|\d+\sм|\d+\sметров|\d+метров/i';
# Получаем все совпадения в $matches[0]
if ( preg_match_all($re, $dlina, $matches) > 0 ) {
# Фильтруем их и убираем м,метров
# Прикол в чём, что intval обрубает знаки справа если это не спецсимволы
# А пробел и "м" это не спецсимволы.
$matches = array_map(fn($e) => intval($e), $matches[0]);
# Собарем из массива [420, 400] строку
$dlina = implode(", ", $matches);
echo $dlina;
} else {
echo "Nothing found...";
}
Автор решения: teran
→ Ссылка
если нужно только первое совпадение, то используйте preg_match а не preg_match_all
if(preg_match('/(\d+)\s?(?=м(?>етров)?\b)/iu', $txt, $matches)){
$result = $matches[1];
}
если нужны все, то оставляете preg_match_all и результат все также в $matches[1]