Получить только одно совпадение строки

Находим числа, после которых стоит "м".

$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]

→ Ссылка