Php 复杂的正则表达式请求-需要字符串中的三个变量
我尝试分解字符串数据,如下三个示例所示: 2019年7月2日-第2场比赛SHANE MURPHY绘画366米Php 复杂的正则表达式请求-需要字符串中的三个变量,php,regex,Php,Regex,我尝试分解字符串数据,如下三个示例所示: 2019年7月2日-第2场比赛SHANE MURPHY绘画366米 2019年7月28日-比赛2温纳姆运输处女F 366M 2011年12月1日-第1场麦圭甘葡萄酒博科尔宾处女赛400米 并用子集填充表信息 因为字符串的开头都相同,所以我设法提取了比赛日期[0]和比赛编号[3] 我看过正则表达式,但我不确定如何提取比赛名称和比赛长度 使用上述示例,提取的种族名称应为: 肖恩·墨菲绘画 温纳姆拖运少女F 麦奎根葡萄酒博科尔宾少女酒店 提取的比赛距离应为:
- 366M
- 366M
- 400M
-
有没有一种简单的方法可以使用PHP从字符串生成这些数据?我需要同时使用正则表达式和explode吗?有什么建议吗
我能够提取日期和比赛编号,因为它们位于字符串的顶部,但由于比赛X后的空格等原因,我无法提取其他变量
$race_info = explode(" ",$row['race_name']);
echo "Race number: {$race_info[3]} <br>";
echo "Race date: {$race_info[0]} <br>";
// need to find race name (in middle of the string)
echo "Race name: ";
// need to find last word ending in M (e.g. 600M, 1200M, 40M)
echo "Race length: ";
$race\u info=explode(“,$row['race\u name']);
echo“种族编号:{$Race_info[3]}
”;
echo“比赛日期:{$Race_info[0]}
”;
//需要查找种族名称(在字符串中间)
回声“种族名称:”;
//需要找到以M结尾的最后一个单词(例如600M、1200M、40M)
回声“比赛长度:”;
有两种主要的方法,第一种是使用正则表达式
使用([\d\/]{10,})-RACE(\d*)([\w]*)(\d*M)
将匹配:
([\d\/]{10,})
10个数字和/-的组合,这是
日期
-RACE(\d*)
这是文字上的RACE,后跟数字
比赛号码
([\w]*)
这是名称的字母(和空格)序列
(\d*M)
后跟文字M的数字
所以代码是
$row = ['race_name' => '28/07/2019 - RACE 2 WYNNUM HAULAGE Maiden F 366M'];
preg_match("/([\d\/]{10,}) - RACE (\d*) ([\w ]*) (\d*M)/",
$row['race_name'],
$race_info);
echo "Race number: {$race_info[2]} <br>";
echo "Race date: {$race_info[1]} <br>";
echo "Race name: {$race_info[3]}<br>";
// need to find last word ending in M (e.g. 600M, 1200M, 40M)
echo "Race length: {$race_info[4]} <br>";
$row=['race_name'=>'2019年7月28日-race 2 WYNNUM运输处女F 366M';
预匹配(“/([\d\/]{10,})-RACE(\d*)([\w]*)(\d*M)/”,
$row['race_name'],
$race_info);
echo“种族编号:{$Race_info[2]}
”;
echo“比赛日期:{$Race_info[1]}
”;
echo“种族名称:{$Race_info[3]}
”;
//需要找到以M结尾的最后一个单词(例如600M、1200M、40M)
echo“Race length:{$Race_info[4]}
”;
或者,您可以坚持使用explode并计算出哪些部分是哪些部分。你已经有了日期和比赛号码,最后一个将是距离,比赛号码和距离之间的所有位将重新连接在一起,以给出比赛名称
$row = ['race_name' => '28/07/2019 - RACE 2 WYNNUM HAULAGE Maiden F 366M'];
$race_info = explode(" ",$row['race_name']);
echo "Race number: {$race_info[3]} <br>";
echo "Race date: {$race_info[0]} <br>";
$length = count($race_info);
// need to find race name (in middle of the string)
$name = implode(" ", array_slice($race_info, 4, $length-5));
echo "Race name: {$name}<br>";
// need to find last word ending in M (e.g. 600M, 1200M, 40M)
echo "Race length: {$race_info[$length - 1]} <br>";
$row=['race_name'=>'2019年7月28日-race 2 WYNNUM运输处女F 366M';
$race_info=explode(“,$row['race_name']);
echo“种族编号:{$Race_info[3]}
”;
echo“比赛日期:{$Race_info[0]}
”;
$length=计数($race\u info);
//需要查找种族名称(在字符串中间)
$name=内爆(“,数组片($race\u info,4,$length-5));
echo“种族名称:{$name}
”;
//需要找到以M结尾的最后一个单词(例如600M、1200M、40M)
echo“Race length:{$Race_info[$length-1]}
”;
有两种主要的方法,第一种是使用正则表达式
使用([\d\/]{10,})-RACE(\d*)([\w]*)(\d*M)
将匹配:
([\d\/]{10,})
10个数字和/-的组合,这是
日期
-RACE(\d*)
这是文字上的RACE,后跟数字
比赛号码
([\w]*)
这是名称的字母(和空格)序列
(\d*M)
后跟文字M的数字
所以代码是
$row = ['race_name' => '28/07/2019 - RACE 2 WYNNUM HAULAGE Maiden F 366M'];
preg_match("/([\d\/]{10,}) - RACE (\d*) ([\w ]*) (\d*M)/",
$row['race_name'],
$race_info);
echo "Race number: {$race_info[2]} <br>";
echo "Race date: {$race_info[1]} <br>";
echo "Race name: {$race_info[3]}<br>";
// need to find last word ending in M (e.g. 600M, 1200M, 40M)
echo "Race length: {$race_info[4]} <br>";
$row=['race_name'=>'2019年7月28日-race 2 WYNNUM运输处女F 366M';
预匹配(“/([\d\/]{10,})-RACE(\d*)([\w]*)(\d*M)/”,
$row['race_name'],
$race_info);
echo“种族编号:{$Race_info[2]}
”;
echo“比赛日期:{$Race_info[1]}
”;
echo“种族名称:{$Race_info[3]}
”;
//需要找到以M结尾的最后一个单词(例如600M、1200M、40M)
echo“Race length:{$Race_info[4]}
”;
或者,您可以坚持使用explode并计算出哪些部分是哪些部分。你已经有了日期和比赛号码,最后一个将是距离,比赛号码和距离之间的所有位将重新连接在一起,以给出比赛名称
$row = ['race_name' => '28/07/2019 - RACE 2 WYNNUM HAULAGE Maiden F 366M'];
$race_info = explode(" ",$row['race_name']);
echo "Race number: {$race_info[3]} <br>";
echo "Race date: {$race_info[0]} <br>";
$length = count($race_info);
// need to find race name (in middle of the string)
$name = implode(" ", array_slice($race_info, 4, $length-5));
echo "Race name: {$name}<br>";
// need to find last word ending in M (e.g. 600M, 1200M, 40M)
echo "Race length: {$race_info[$length - 1]} <br>";
$row=['race_name'=>'2019年7月28日-race 2 WYNNUM运输处女F 366M';
$race_info=explode(“,$row['race_name']);
echo“种族编号:{$Race_info[3]}
”;
echo“比赛日期:{$Race_info[0]}
”;
$length=计数($race\u info);
//需要查找种族名称(在字符串中间)
$name=内爆(“,数组片($race\u info,4,$length-5));
echo“种族名称:{$name}
”;
//需要找到以M结尾的最后一个单词(例如600M、1200M、40M)
echo“Race length:{$Race_info[$length-1]}
”;
如果比赛信息与此处显示的一样一致,那么preg_match功能将很好地解决这一问题。下面是一个示例代码段:
$str = '02/07/2019 - RACE 2 SHANE MURPHY PAINTING 366M';
if ( preg_match( '/^([0-9]{2}\/[0-9]{2}\/[0-9]{4}) - RACE ([0-9]{1,}) (.*) ([0-9]{3,}M)$/', $str, $matches ) ) {
echo "Race number: ${matches[2]}\n";
echo "Race date: ${matches[1]}\n";
echo "Race name: ${matches[3]}\n";
echo "Race length ${matches[4]}\n";
} else {
echo "Cannot parse the string\n";
}
这将产生以下输出:
Race number: 2
Race date: 02/07/2019
Race name: SHANE MURPHY PAINTING
Race length 366M
请注意,括号“()”中的匹配最终会在传递给preg_match函数的$matches数组中结束。与往常一样,在线提供更多信息:如果比赛信息与此处显示的一致,那么preg_match功能将很好地实现这一点。下面是一个示例代码段:
$str = '02/07/2019 - RACE 2 SHANE MURPHY PAINTING 366M';
if ( preg_match( '/^([0-9]{2}\/[0-9]{2}\/[0-9]{4}) - RACE ([0-9]{1,}) (.*) ([0-9]{3,}M)$/', $str, $matches ) ) {
echo "Race number: ${matches[2]}\n";
echo "Race date: ${matches[1]}\n";
echo "Race name: ${matches[3]}\n";
echo "Race length ${matches[4]}\n";
} else {
echo "Cannot parse the string\n";
}
这将产生以下输出:
Race number: 2
Race date: 02/07/2019
Race name: SHANE MURPHY PAINTING
Race length 366M
请注意,括号“()”中的匹配最终会在传递给preg_match函数的$matches数组中结束。像往常一样,更多的信息可以在网上找到:^([\d]{2}\/[\d]{2}\/[\d]{4})-种族([0-9]+)(.*)([\d]+M)$
可能是一种可能性。^([\d]{2}\/[\d]{2}\/[\d]{4})-种族([0-9]+)(.*.[\d]-[\d]+M)$
可能是一种可能性。谢谢这个选项。是的,字符串是非常一致的,除了我被告知距离有时可能是5个字符,例如105