PHP能否从字符串创建变量?Laravel5.8邮件内容转变量存储需求
问题解答
一、PHP中能否从字符串创建变量?
当然可以!PHP提供了几种灵活的方式实现这个需求,但使用时一定要注意安全——尤其是处理不可信数据时,要避免变量覆盖带来的风险。
两种常用实现方式:
双美元符号($$)
直接通过字符串变量名动态创建新变量:$varName = 'location'; $$varName = "UNIT 1 PERCH 1"; echo $location; // 输出:UNIT 1 PERCH 1extract()函数
批量将数组的键转为变量名、键值转为变量值:$data = [ 'location' => "UNIT 1 PERCH 1", 'subLoc' => "House 1, Pen 1", 'age' => "3 DAYS" ]; // 加上EXTR_SKIP参数避免覆盖已存在的变量 extract($data, EXTR_SKIP); echo $subLoc; // 输出:House 1, Pen 1
二、Laravel中提取邮件正文特定内容并存入数据库
针对你提供的邮件格式,我们可以通过正则匹配+字符串解析来提取所需数据,具体步骤如下:
1. 获取数据库中的邮件正文
假设你已经用Email模型存储了邮件内容,先取出纯文本正文:
$email = Email::find($yourEmailId); $content = $email->body; // 这里是存储的text/plain格式正文
2. 解析正文提取PERCH区块
邮件里每个PERCH区块以-----UNIT 1 PERCH X-----开头,我们用正则匹配出所有区块:
// 匹配所有PERCH区块的正则,s修饰符让.匹配换行符 preg_match_all('/-----UNIT 1 PERCH (\d+)-----(.*?)(?=-----|$)/s', $content, $matches); // 遍历每个匹配到的区块 foreach ($matches[1] as $index => $perchNumber) { $blockContent = trim($matches[2][$index]); // 提取当前区块的各项数据 $subLoc = $this->getBlockValue($blockContent, '/House (.*)/'); $age = $this->getBlockValue($blockContent, '/Age DAYS (\d+)/'); $total = $this->getBlockValue($blockContent, '/Total (\d+)/'); $averageGms = $this->getBlockValue($blockContent, '/Average GMS (\d+)/'); // 存入数据库(假设你有PerchReport模型) PerchReport::create([ 'email_id' => $yourEmailId, 'perch_number' => $perchNumber, 'sub_loc' => $subLoc, 'age' => $age . ' DAYS', 'total' => $total, 'average_gms' => $averageGms, // 其他字段如偏差、均匀度等同理添加 ]); }
3. 封装辅助提取函数
把重复的正则提取逻辑封装成工具函数,方便复用:
/** * 从区块内容中提取指定值 */ private function getBlockValue($blockContent, $pattern) { preg_match($pattern, $blockContent, $match); return isset($match[1]) ? trim($match[1]) : null; }
小提示
- 如果邮件格式有细微变动,比如分隔线符号、字段顺序调整,需要对应修改正则表达式;
- 可以先对原始正文做预处理,比如去除多余的空行、连续空格,让解析更稳定;
- 测试时可以先打印
$matches数组,确认正则是否正确匹配到了所有区块。
内容的提问来源于stack exchange,提问作者Brendan O' Neill
相关产品推荐
相关产品推荐

