为了账号安全,请及时绑定邮箱和手机立即绑定

复杂的正则表达式请求 - 需要来自字符串的三个变量

复杂的正则表达式请求 - 需要来自字符串的三个变量

PHP
largeQ 2021-12-24 09:06:18
我正在尝试像以下三个示例一样分解字符串数据:02/07/2019 - 第 2 场 SHANE MURPHY 绘画 366M28/07/2019 - RACE 2 WYNNUM HAULAGE Maiden F 366M01/12/2011 - 第 1 场 MCGUIGAN WINES POKOLBIN MAIDEN 400M并用子集填充表信息。因为所有的字符串都以相同的方式开始,所以我设法提取了比赛日期 [0] 和比赛编号 [3]。我看过正则表达式,但我不确定如何提取比赛名称和比赛长度。使用上面的例子提取的种族名称应该是:肖恩墨菲绘画WYNNUM HAULAGE Maiden F麦圭根葡萄酒波科尔宾少女提取的比赛距离应该是:366M366M400M有没有一种简单的方法可以使用 PHP 从字符串中生成这些数据?我需要同时使用正则表达式和爆炸吗?请问有什么建议吗?我能够提取日期和比赛编号,因为它们位于字符串的顶部,但由于 Race 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: ";
查看完整描述

2 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

假设比赛信息与您在此处显示的一样一致, 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 数组中。像往常一样,在线提供更多信息:https : //www.php.net/manual/en/function.preg-match.php


查看完整回答
反对 回复 2021-12-24
?
杨魅力

TA贡献1811条经验 获得超6个赞

有两种主要方法,第一种是使用正则表达式...

使用([\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' => '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>";


查看完整回答
反对 回复 2021-12-24
  • 2 回答
  • 0 关注
  • 129 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号