我失败了,我需要一些正则表达式来替换一些文本信息。
以下任务也可以在非正则表达式中完成,但如果将它放在正则表达式中会很好,因为有很多要替换的。
但问题是:
[\w\. \&\=\?\-\(\)\'\+]
中找到可能出现3-99次的字符,所以写:[\w\. \&\=\?\-\(\)\'\+]{3-99}
\n?
<[email protected]>
因此,如果我使用:((?!for)[\w\. \&\=\?\-\(\)\'\+]{3,99}|(\n?))<test@mail\.se>
,“for”这个词即使匹配也会匹配。有人有想法吗?
例如:在这个字符串中:
To: Lasse Erikson <[email protected]>
我想匹配名称和邮件。
即使在这里:
To: Lasse Erikson <[email protected]>, Sara
Larsson <[email protected]>
但在这里我不想取任何东西:
for <[email protected]>; Thu, 14 Dec 2017 21:18:22 +0100 (CET)
因为行中有“for”。
我希望你明白这一点......
先感谢您
PHP(PCRE)提供了一些动词来跳过或失败当前匹配过程,您可以使用它来跳过单词for
或者如果您需要,则可以使整个匹配失败:
((?(?=\bfor\b)for(*SKIP)(*F))[ \w.(&=?\-+)](?(2)|(\R)?)){3,99}<[^<>@]*@[^<>]*>
分解:
( # Start of capturing group #1
(?(?=\bfor\b)for(*SKIP)(*F)) # Skip over `for` if any
[ \w.(&=?\-+)] # Match whitelist characters
(?(2)|(\R)?) # One newline character between
){3,99} # Between 3 or 99 times, end of CG #1
<[^<>@]*@[^<>]*> # Match an email format