我的字符串中列出了一年
$s = "Acquired by the University in 1988";
实际上,这可能是此单行字符串中的任何位置。如何使用regexr提取它?我试过\ d但是没有用,它只是出现了一个错误。
杰森
我在LAMP 5.2中使用preg_match
答案 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
中查看此操作
答案 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];