1

我正在尝试使用preg_match_all来处理来自git log --pretty=raw --all.

我得到的样本数据是这样的:

commit 5650c7841f72c4c65689b0d4bc83ccd70e5b2362 (HEAD, origin/master, origin/HEAD, master)
tree 69c6036c64c805e9c335b2eadd87b43af90ee1ad
parent a912fdd530efe69dae4b0f417c8a8631d68f469c
parent 113e128efe54511f2b0bdd589301ffe039fc185e
author Author Name 3 <author.name.3@gmail.com> 1371835063 -0700
committer Committer Name 3 <committer.name.3@gmail.com> 1371835063 -0700

    Merge pull request #60 from sample/master

    Line 2 message

commit 94e99889226671dc479be770968df2692e09db11 (origin/fixit)
tree f900c172fa633b3769b982614ce639e3ee6f3b62
parent dc56687f1597b317064b0d899c2450fb6805791e
author Author Name 2 <author.name.2@something.com.tld> 1370944188 +0300
committer Committer Name 2 <committer.name.2@something.com.tld> 1370944188 +0300

    1 line message

commit dc56687f1597b317064b0d899c2450fb6805791e
tree cb1573ccde7ddcb2e54b9b9a777e11a435d532ac
parent a912fdd530efe69dae4b0f417c8a8631d68f469c
author Author Name 1 <author.name.1@gmail.com> 1370640640 +0300
committer Committer Name 1 <committer.name.1@gmail.com> 1370943413 +0300

    Message contain words like commit tree parent author committer to screw your regex.
    Also contain other symbols like @ # ! % ( ) = - |

    Can you handle 2nd paragraph?

    3rd paragraph?

`

我想提取

  • 提交哈希
  • 树哈希
  • 父母哈希
  • 作者姓名
  • 提交者,和
  • 提交消息

我能得到的最接近的是:

/^commit (.{40})(.*)\s^tree (.{40})\s^parent (.{40})\s(^parent (.{40})\s)?^author (.+)\s^committer (.+)\s+(.+)\s+/m

结果是这样的: http ://regex101.com/r/cY4qV4

对于上述不容易破坏的数据,是否有更准确的正则表达式?

需要注意的一点:

  1. 标签,提交后 () 中的分支(附加问题:是否可以在 1 个正则表达式内用逗号 (,) 分隔标签/分支?)
  2. 一些提交有 2 个父母
  3. 提交消息可能包含您在正则表达式中使用的多个段落、奇怪的符号或单词
4

1 回答 1

4

preg_match_all我建议使用--pretty=format:并制作可解析的 XML,而不是原始输出:

$out = shell_exec(
    'git log --max-count=10 --pretty=format:'.
    '"<commit><hash>%H</hash><date>%ad</date><msg><![CDATA[%s]]></msg></commit>"'
);
$commits = simplexml_load_string(
    '<?xml version="1.0" encoding="utf-8"?><commits>'.$out.'</commits>'
);

所有可用的选项都可以在http://git-scm.com/book/en/Git-Basics-Viewing-the-Commit-History(中间的表格)上找到。请记住<![CDATA[ ]]>在消息、姓名和电子邮件周围使用,因为其中一些可能包含会破坏 XML 的字符。

于 2013-08-08T17:05:56.827 回答