问题描述
|
我的字符串中列出了一年
$s = \"Acquired by the University in 1988\";
实际上,这可以在此单行字符串中的任何位置。如何使用regexr提取它?我尝试了\\ d,但是没有用,只是出现了一个错误。
杰森
我在LAMP 5.2中使用preg_match
解决方法
/(^|\\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上查看实际运行情况
,您需要一个正则表达式来匹配四个数字,并且这四个数字必须包含一个完整的单词(即,一个10位数字的字符串包含四个数字,但不是一年。)因此,正则表达式需要像这样包含单词边界:
if (preg_match(\'/\\b\\d{4}\\b/\',$s,$matches)) {
$year = $matches[0];
}
,试试这个代码:
<?php
$s = \"Acquired by the University in 1988 year.\";
$yr = preg_replace(\'/^[^\\d]*(\\d{4}).*$/\',\'\\1\',$s);
var_dump($yr);
?>
输出:
string(4) \"1988\"
但是,此正则表达式的前提是4位数字仅在行中出现一次。
,好的,您可以使用\\d{4}
,但是如果字符串中有四位数字还有其他东西的话,那将会中断。
编辑:
问题在于,除了四个数字字符外,实际上没有任何其他标识信息(因为根据您的要求,数字可以在字符串中的任何位置),因此根据您所写的内容,这可能是在范围之外检查返回值的最佳方法。
$str = \"the year is 1988\";
preg_match(\'/\\d{4}/\',$str,$matches);
var_dump($matches);
,preg_match(\'/(\\d{4})/\',$string,$matches);
,对于基本年份比赛,假设只有一年
$year = false;
if(preg_match(\"/\\d{4}/\",$match)) {
$year = $match[0];
}
如果您需要在同一字符串中处理多年的可能性
if(preg_match_all(\"/\\d{4}/\",$matches,PREG_SET_ORDER)) {
foreach($matches as $match) {
$year = $match[0];
}
}
,/(?<!\\d)\\d{4}(?!\\d)/
仅匹配在其前后没有数字的4位数字。
(?<!\\d)
和ѭ14(分别是先行断言和先行断言,可确保在RE的主要部分之前或之后不会出现\\d
。
实际上,使用ѭ16代替断言可能更明智;这样可以确保一年的开始和结束出现在“单词边界”处。因此,\“ 1337hx0r \”将被适当地忽略。
如果您只想寻找过去一个世纪左右的年份,则可以使用
/\\b(19|20)\\d{2}\\b/
,另外,如果您的字符串是这样的:
$date = \"20044Q\";
您可以使用以下代码从任何字符串中提取年份。
preg_match(\'/(?:(?:19|20)[0-9]{2})/\',$date,$matches);
echo $matches[0];