REGEXR帮助 - 如何从字符串中提取一年

时间:2011-04-15 01:56:43

标签: php regex

我的字符串中列出了一年

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

实际上,这可能是此单行字符串中的任何位置。如何使用regexr提取它?我试过\ d但是没有用,它只是出现了一个错误。

杰森

我在LAMP 5.2中使用preg_match

8 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:2)

好吧,你可以使用\d{4},但是如果字符串中还有其他四位数,那么这将会中断。

修改

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

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

var_dump($matches);

答案 2 :(得分:2)

试试这段代码:

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

输出:

string(4) "1988"

然而,这个正则表达式假设4位数字在该行中只出现一次。

答案 3 :(得分:1)

preg_match('/(\d{4})/', $string, $matches);

答案 4 :(得分:1)

/(^|\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

http://refiddle.com/10k

中查看此操作

答案 5 :(得分:0)

对于基本的年度比赛,假设只有一年

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

答案 6 :(得分:0)

/(?<!\d)\d{4}(?!\d)/将仅匹配在其之前或之后没有数字的4位数字。

(?<!\d)(?!\d)是后视和前瞻(分别)assertions,确保\d在主要部分之前或之后不会发生RE

使用\b而不是断言可能在实践中更明智;这将确保年初和年末出现在“word boundary”。那么“1337hx0r”将被适当忽略。

如果你只是在过去一个世纪左右寻找年,你可以使用

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

答案 7 :(得分:0)

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

$date = "20044Q";

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

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