这可以满足您的需求,但它非常脆弱,而且这确实不是您应该在 TT 代码中做的事情。您应该获取在模板外部解析的数据并将其传递到变量中,或者您应该传入一个可以从模板内部调用的解析子例程。
但是,在给你警告之后,如果你仍然坚持这是你想做的事,那么你可能会这样做:
在test.tt:
[% text = '"John Doe" <email@example.com>';
matches = text.match('"(.*?)"\s+<(.*?)>');
IF matches -%]
Name: [% matches.0 %]
Email: [% matches.1 %]
[% ELSE -%]
No match found
[% END -%]
然后,使用tpage进行测试:
$ tpage test.tt
Name: John Doe
Email: email@example.com
但我不能再强调你不应该这样做。
更新:我已使用此测试模板来调查您的进一步问题。
[% item = { from => '"John Doe" <email@example.com>' };
text = item.from -%]
[% IF (matches = text.match('(.*?)(\s)?+<(.*?)>')) -%]
<td>[% matches.1 %]</td>
[% ELSE -%]
<td>[% text %]</td>
[% END %]
运行它,我得到了这个:
$ tpage test2.tt
<td> </td>
这就是我希望在比赛中看到的。您正在打印matches.1。这是matches 数组中的second 项。第二个匹配组是(\s)。所以我得到了名称和左尖括号之间的空格。
您可能不希望 matches 数组中的空格匹配,所以我会删除它周围的括号,以制作正则表达式 (.*?)\s*<(.*?)>(请注意,\s* 是一种更简单的方式来表示“零或更多空白字符”)。
您现在可以使用matches.0 获取姓名,使用matches.1 获取电子邮件地址。
哦,没有必要将items.from 复制到text。您可以在任何标量变量上调用 matches vmethod,因此使用起来可能更简单:
[% matches = item.from.match(...) -%]
我有没有提到这是一个非常糟糕的想法? :-)
更新2:
如果您以与我为您做的相同方式提供完整、可运行的代码示例,这一切都会变得容易得多。每当我必须编辑某些内容以使示例运行时,我们就有可能会错误地猜测您的代码是如何工作的。
但是,请记住,这是我最新的测试模板:
[% item = {
'date' => '2021-03-25',
'time' => '03:58:18',
'href' => 'https://example.com',
'from' => 'fezius@evrostroyserov.ru on behalf of Caroline <fezius@evrostroyserov.ru>',
'bytes' => 13620,
'pmail' => 'user@example.com',
'sender' => 'sender@example.com',
'subject' => 'Some Email Subject'
};
text = item.from -%]
[% IF (matches = text.match('(.*?)(\s)?<(.*?)>')) -%]
<td>[% matches.2 %]</td>
[% ELSE -%]
<td>[% text %]</td>
[% END %]
我已经更改了item 的定义以获取完整示例。我已经离开了正则表达式,就像我提出建议之前一样。而且(因为我没有更改正则表达式)我已将输出更改为打印matches.2 而不是matches.1.
接下来会发生什么:
$ tpage test3.tt
<td>fezius@evrostroyserov.ru</td>
所以它起作用了。
如果您的代码不起作用,那么您需要确定我的(工作)代码和您的(非工作)代码之间的区别。我很乐意帮助您识别这些差异,但您必须给出您的非工作示例才能让我这样做。
更新3:
我再次尝试合并您所说的更改。但同样,我不得不猜测一些东西,因为您没有共享完整的可运行示例。同样,我的代码按预期工作。
[% USE dumper -%]
[% item = {
'date' => '2021-03-25',
'time' => '03:58:18',
'href' => 'https://example.com',
'from' => 'fezius@evrostroyserov.ru on behalf of Caroline <fezius@evrostroyserov.ru>',
'bytes' => 13620,
'pmail' => 'user@example.com',
'sender' => 'sender@example.com',
'subject' => 'Some Email Subject'
};
-%]
[% matches = item.from.match('(.*?)(\s)?<(.*?)>') -%]
[% dumper.dump(matches) %]
并对其进行测试:
$ tpage test4.tt
$VAR1 = [
'fezius@evrostroyserov.ru on behalf of Caroline',
' ',
'fezius@evrostroyserov.ru'
];
这样就行了。如果您需要更多帮助,请发送一个完整的可运行示例。如果你不这样做,我将无法再帮助你。