正则表达式 |爆炸 | 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);
但这是一个有限的解决方案,因为它不适用于所有标题。我如何使用 Regex
、explode
、str_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'
我正在举一个例子,这样你就可以理解我想要实现的目标。 我得到了这个标题:
$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);
但这是一个有限的解决方案,因为它不适用于所有标题。我如何使用 Regex
、explode
、str_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'