我的字符串中列出了一年
$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];