Regex | взорваться | str_split для соответствия номеру в заголовке

Я привожу пример, чтобы вы могли понять, чего я хочу достичь. Получил такие титулы:

$t1 = "Disposizione n. 158 del 28.1.2012";
$t2 = "Disposizione n.66 del 15.1.2006";
$t3 = "Disposizione f_n_66 del 15.1.2001";
$t4 = "Disposizione numero 66 del 15.1.2018";
$t5 = "Disposizione nr. 66 del 15.1.2017";
$t6 = "Disposizione nr_66 del 15.1.2016";
$t7 = "Disposizione numero_66 del 15.1.2005";

До сих пор я пробовал:

$output = explode(' ', $t1);

foreach ($output as $key => $value) {

if($value == 'n.' || $value == 'numero' || $value == 'n' || $value == 'nr' || $value == 'nr.') {
    $number= $output[($key+1)];
    break;
}
}

print_r($attoNumero);

Но это ограниченное решение, потому что оно работает не со всеми заголовками. Как я могу использовать _3 _, _ 4 _, _ 5_ или что-нибудь еще для этого?


person Marinario Agalliu    schedule 29.01.2021    source источник
comment
Вы уже пробовали какой-либо шаблон регулярного выражения?   -  person Wiktor Stribiżew    schedule 29.01.2021
comment
Нет, потому что у меня это плохо получается ... поэтому я прошу любое решение, которое может быть на PHP или Regex   -  person Marinario Agalliu    schedule 29.01.2021
comment
Означает ли это, что вы просто хотите извлечь первое число? Все эти числа являются первыми числами в каждой строке.   -  person Wiktor Stribiżew    schedule 29.01.2021
comment
Там так же несколько случаев, которые не являются первым номером. Но необходимое число всегда будет после некоторого n., numero или nr_ и т. Д.   -  person Marinario Agalliu    schedule 29.01.2021
comment
пример: Disposizione del 31.12.2007 n. 1272   -  person Marinario Agalliu    schedule 29.01.2021
comment
Каков ожидаемый результат для каждого заголовка?   -  person nice_dev    schedule 29.01.2021
comment
число после n., number или n_ ecc   -  person Marinario Agalliu    schedule 29.01.2021


Ответы (1)


Вы можете использовать

if (preg_match('~(?<![^\W_])n(?:r?[_.]|umero_?)\s*\K\d+~i', $text, $match)) {
    echo $match[0];
}

См. демонстрацию регулярных выражений. Подробности:

  • (?<![^\W_]) - граница слова с вычтенной позицией _ (прямо перед ним должно быть начало строки или не буквенно-цифровой символ)
  • n - n симв.
  • (?:r?[_.]|umero_?) - либо необязательный r, а затем _ или ., либо umero и необязательный _ символ
  • \s* - ноль или более пробелов
  • \K - оператор сброса совпадения
  • \d+ - одна или несколько цифр.

См. демонстрацию PHP:

$texts = ["Disposizione n. 158 del 28.1.2012", "Disposizione n.66 del 15.1.2006","Disposizione f_n_66 del 15.1.2001", "Disposizione numero 66 del 15.1.2018", "Disposizione nr. 66 del 15.1.2017", "Disposizione nr_66 del 15.1.2016", "Disposizione numero_66 del 15.1.2005"];
foreach ($texts as $text) {
    if (preg_match('~(?<![^\W_])n(?:r?[_.]|umero_?)\s*\K\d+~i', $text, $match)) {
        echo $match[0] . " found in '$text'" . PHP_EOL;
    } else echo "No match in $text!\n";
}

Выход:

158 found in 'Disposizione n. 158 del 28.1.2012'
66 found in 'Disposizione n.66 del 15.1.2006'
66 found in 'Disposizione f_n_66 del 15.1.2001'
66 found in 'Disposizione numero 66 del 15.1.2018'
66 found in 'Disposizione nr. 66 del 15.1.2017'
66 found in 'Disposizione nr_66 del 15.1.2016'
66 found in 'Disposizione numero_66 del 15.1.2005'
person Wiktor Stribiżew    schedule 29.01.2021
comment
Работает, спасибо большое! Ответ будет принят через 5 мин. Ты мой спаситель на сегодня. Удачного кодирования! - person Marinario Agalliu; 29.01.2021
comment
Решено красиво с ретроспективой +1 - person The fourth bird; 29.01.2021