PHP字符串替换:将by与for之间的内容替换为指定模式
用PHP实现邮件Received头的内容替换需求
这个需求用PHP的正则替换工具就能轻松搞定,核心是精准定位by和for之间的内容并替换成指定字符。
完整实现代码
// 定义原始字符串变量 $example1 = "Received: from example.host.com (example.host.com [1.2.3.4]) by received.host.com (Postfix) with ESMTP id 123456789ABCD for ; Tue, 3 Apr 2018 12:33:59 +0200 (CEST)"; $example2 = "Received: from another.example.org (unknown [22.33.44.55]) by another.received.org (Postfix) with ESMTP id 987654321FEDC for ; Tue, 3 Apr 2018 12:35:15 +0200 (CEST)"; // 正则匹配规则:精准捕获by(带空格)、中间可变内容、for(带空格) $pattern = '/(by\s)(.*?)(\sfor)/'; // 替换模板:保留by和for的结构,中间替换为... $replacement = '$1...$3'; // 执行替换操作 $modified1 = preg_replace($pattern, $replacement, $example1); $modified2 = preg_replace($pattern, $replacement, $example2); // 输出结果 echo $modified1 . PHP_EOL; echo $modified2 . PHP_EOL;
正则规则细节解释
(by\s):捕获by后面的空格,确保匹配的是Received头里的关键字by,避免误匹配其他包含"by"的单词(.*?):使用非贪婪匹配任意字符,这是关键——它会只匹配到第一个for前面的内容,不会过度匹配字符串后续的其他内容(\sfor):捕获for前面的空格,保证替换后by...for的格式和你给出的示例完全一致
替换后效果示例
运行代码后,$modified1的输出就是你期望的格式:
"Received: from example.host.com (example.host.com [1.2.3.4]) by...for ; Tue, 3 Apr 2018 12:33:59 +0200 (CEST)"
这个方案能完美适配你提供的两个示例,也能兼容大多数标准格式的邮件Received头。
内容的提问来源于stack exchange,提问作者Darwick
相关产品推荐
相关产品推荐

