正则表达式 |爆炸 | str_split 匹配标题中的数字

Regex | explode | str_split to match number in a title

我正在举一个例子,这样你就可以理解我想要实现的目标。 我得到了这个标题:

$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);

但这是一个有限的解决方案,因为它不适用于所有标题。我如何使用 Regexexplodestr_split 或其他任何方法来实现此目的?

你可以使用

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

regex demo详情:

  • (?<![^\W_]) - 减去 _ 位置的单词边界(就在前面,必须有字符串的开头,或非字母数字字符)
  • n - n 字符
  • (?:r?[_.]|umero_?) - 可选的 r 然后是 _.,或者 umero 和可选的 _ char
  • \s* - 零个或多个空白字符
  • \K - 匹配重置运算符
  • \d+ - 一位或多位数字。

参见 PHP demo:

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