Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 复杂的正则表达式请求-需要字符串中的三个变量_Php_Regex - Fatal编程技术网

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

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 麦奎根葡萄酒博科尔宾少女酒店 提取的比赛距离应为:

我尝试分解字符串数据,如下三个示例所示:

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