从字符串中提取4位数的年份值



我的字符串中列出了一年

$s = "Acquired by the University in 1988";

在实践中,它可以在这个单行字符串中的任何位置。如何使用正则表达式提取它?我尝试了d,但没有成功,只是出现了一个错误。

我在LAMP 5.2 中使用preg_match

您需要一个正则表达式来匹配四个数字,而这四个数字必须包含一个完整单词(即,一个10位的字符串包含四个数字但不是一年。(因此,正则表达式需要包含单词边界,如下所示:

if (preg_match('/bd{4}b/', $s, $matches)) {
    $year = $matches[0];
}

好吧,可以使用d{4},但如果字符串中有其他四位数字,则会中断。

编辑:

问题是,除了四个数字字符之外,实际上没有任何其他识别信息(因为根据您的要求,数字可以在字符串中的任何位置(,所以根据您所写的内容,这可能是您可以在范围外检查返回值的最佳方法。

$str = "the year is 1988";
preg_match('/d{4}/', $str, $matches);
var_dump($matches);

试试这个代码:

<?php
  $s = "Acquired by the University in 1988 year.";
  $yr = preg_replace('/^[^d]*(d{4}).*$/', '1', $s);
  var_dump($yr);
?>

输出:

string(4) "1988"

然而,这个正则表达式的工作原理是假设4位数字只在行中出现一次。

/(^|s)(d{4})(s|$)/gm

匹配

Acquired by the University in 1988
The 1945 vintage was superb
1492 columbus sailed the ocean blue

忽略

There were nearly 10000 people there!
Member ID 45678
Phone Number 951-555-2563
preg_match('/(d{4})/', $string, $matches);

对于基本年份匹配,假设只有一年

$year = false;
if(preg_match("/d{4}/", $string, $match)) {
  $year = $match[0];
}

如果您需要在同一字符串中处理多年的可能性

if(preg_match_all("/d{4}/", $string, $matches, PREG_SET_ORDER)) {
  foreach($matches as $match) {
    $year = $match[0];
  }
}

/(?<!d)d{4}(?!d)/将只匹配前后没有数字的4位数字。

(?<!d)(?!d)分别是向后看和向前看断言,确保d不会出现在RE的主要部分之前或之后

在实践中,使用b而不是断言可能更明智;这将确保一年的开始和结束发生在一个"单词边界"。因此,"1337hx0r"将被适当地忽略。

如果你只想在过去一个世纪左右的时间里寻找年份,你可以使用

/b(19|20)d{2}b/

如果你的字符串是这样的:

$date = "20044Q";

您可以使用以下代码从任何字符串中提取年份。

preg_match('/(?:(?:19|20)[0-9]{2})/', $date, $matches);
echo $matches[0];

相关内容

  • 没有找到相关文章

最新更新