Php 使用正则表达式匹配文本中的模式
使用正则表达式匹配模式的最后一个匹配项 关于以下案文:Php 使用正则表达式匹配文本中的模式,php,regex,preg-match,preg-match-all,Php,Regex,Preg Match,Preg Match All,使用正则表达式匹配模式的最后一个匹配项 关于以下案文: commit 5a254a0bfc0232bd838157cada953f87a7b6ffad Merge: 2b9fcd8 a9b214e Author: Peter Pan <peterpan@gmail.com> Date: Wed Dec 7 11:54:08 2016 -0500 Merge branch 'master' of github.com:peterpan/testing commit 2b
commit 5a254a0bfc0232bd838157cada953f87a7b6ffad
Merge: 2b9fcd8 a9b214e
Author: Peter Pan <peterpan@gmail.com>
Date: Wed Dec 7 11:54:08 2016 -0500
Merge branch 'master' of github.com:peterpan/testing
commit 2b9fcd8c10ee18ad2ea88190a3b10cc8affd4093
Author: Peter Pan <peterpan@gmail.com>
Date: Wed Dec 7 11:53:51 2016 -0500
KWP245
commit a9b214eb476e3d1f3896db31125d6e8108dca06d
Author: Peter Pan <peterpan@gmail.com>
Date: Wed Dec 7 10:52:40 2016 -0600
QZN0O5
commit a6be0abd17d3d6b1fdfe0711fe8e41a28b092212
Author: Peter Pan <peterpan@gmail.com>
Date: Wed Dec 7 10:52:38 2016 -0600
QZN0O5
但是没有成功
实际上,我想捕获提交代码:a9b214eb476e3d1f3896db31125d6e8108dca06d
更具体一些。如果你有一个解决方案,那就更好了
您知道如何匹配该文本吗?您可以将以下正则表达式与
preg\u match\u all
一起使用,并获取最后一项:
/^\s*QZN0O5\s*(.*\R.*\R.*+)(?!(?s:.*^\s*QZN0O5))/m
或者——或者:
/^\h*QZN0O5\s*(.*+(?:\R(?!\R).*)*+)(?![\s\S]*?^\h*QZN0O5$)/m
请参阅和
详细信息:
-行开始^
-0个或更多空格\s*
-您需要查找的代码QZN0O5
-0+空格\s*
-3行(.*\R.*\R.+
-但后面不跟任何0+字符(内联修饰符组(?!(?s:.*^\s*QZN0O5))
也会使(?s:..)
匹配换行符),后跟一个行首、0+空格和需要匹配的代码)
-行末$
(.*+(?:\R(?!\R.*)*+)
部分只是使正则表达式匹配,直到出现双线中断
见:
$re='/^\h*QZN0O5\s*(*+(?:\R(?!\R.*)*)*+(?![\s\s]*?^\h*QZN0O5$)/m';
$str="提交5a254a0bfc0232bd838157cada953f87a7b6ffad\r\n合并:2b9fcd8 a9b214e\r\n提交人:彼得·潘\r\n日期:2016年12月7日星期三11:54:08-0500\r\n\r\n合并github.com的分支“master”:彼得潘/测试\r\n\r\n\r\n提交人2b9fcd8c10ee18ad2ea88190a3b10cc8affd4093\r\n日期:彼得·潘\r\n日期:2016年12月7日11:53:51-0500\r\r\nKWP245\r\n\r\n提交文件A9B214EB476E3D1F3896DB311256E8108DCA06D\r\n作者:彼得·潘\r\n日期:2016年12月7日星期三10:52:40-0600\r\n\r\n QZN0O5\r\n\r\n提交文件A6BE10ADD1D6B1FDFE0711FE8E41A28B092212\r\n作者:彼得·潘\r\n日期:2016年12月7日星期三10:52:38-0600\r\r\n\r\r\n QZN0O5\r\n\r\r\n QZN0O5\r\r\n\n0D6B1D6B1D6B1FD027FEB1212\r\r\nPeter Pan\r\n日期:2016年12月7日星期三10:52:38-0600\r\n\r\n H82LKJ\r\n\r\n提交aa72dfeb476e3d1f3896db31125d6e8108dca06d\r\n作者:Peter Pan\r\n日期:2016年12月7日星期三10:52:40-0600”;
预匹配全部($re,$str,$MATCHS);
回显结束($matches[1]);
匹配所有匹配项并获取数组中的最后一项。我只获得一个大匹配项,而不是多个小匹配项。我尝试了其他示例文本,但没有成功。我将其他文本发布在前一个文本的下方。
preg_match("/(?<!commit).*?QZN0O5/is", $text, $matches);
/^\s*QZN0O5\s*(.*\R.*\R.*+)(?!(?s:.*^\s*QZN0O5))/m
/^\h*QZN0O5\s*(.*+(?:\R(?!\R).*)*+)(?![\s\S]*?^\h*QZN0O5$)/m
$re = '/^\h*QZN0O5\s*(.*+(?:\R(?!\R).*)*+)(?![\s\S]*?^\h*QZN0O5$)/m';
$str = "commit 5a254a0bfc0232bd838157cada953f87a7b6ffad\r\nMerge: 2b9fcd8 a9b214e\r\nAuthor: Peter Pan <peterpan@gmail.com>\r\nDate: Wed Dec 7 11:54:08 2016 -0500\r\n\r\n Merge branch 'master' of github.com:peterpan/testing\r\n\r\ncommit 2b9fcd8c10ee18ad2ea88190a3b10cc8affd4093\r\nAuthor: Peter Pan <peterpan@gmail.com>\r\nDate: Wed Dec 7 11:53:51 2016 -0500\r\n\r\n KWP245\r\n\r\ncommit a9b214eb476e3d1f3896db31125d6e8108dca06d\r\nAuthor: Peter Pan <peterpan@gmail.com>\r\nDate: Wed Dec 7 10:52:40 2016 -0600\r\n\r\n QZN0O5\r\n\r\ncommit a6be0abd17d3d6b1fdfe0711fe8e41a28b092212\r\nAuthor: Peter Pan <peterpan@gmail.com>\r\nDate: Wed Dec 7 10:52:38 2016 -0600\r\n\r\n QZN0O5\r\n\r\ncommit bb2762bd17d3d6b1fdfe0711fe8e41a28b092212\r\nAuthor: Peter Pan <peterpan@gmail.com>\r\nDate: Wed Dec 7 10:52:38 2016 -0600\r\n\r\n H82LKJ\r\n\r\ncommit aa72dfeb476e3d1f3896db31125d6e8108dca06d\r\nAuthor: Peter Pan <peterpan@gmail.com>\r\nDate: Wed Dec 7 10:52:40 2016 -0600";
preg_match_all($re, $str, $matches);
echo end($matches[1]);