You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP如何提取特定字符串中的SMS密钥及模板变量

PHP 提取字符串中##KEY##格式占位符密钥的实现方案

嘿,这个需求我之前也碰到过!要从大量包含##USERNAME##、##EXPIRYDATE##这类双#包裹的占位符字符串里提取密钥,用PHP的正则表达式就能完美解决,而且能适配各种不同的键格式。

核心思路

这类占位符的规律很清晰:前后都是两个#,中间是由字母、下划线(可能还有数字)组成的密钥名。我们可以用正则表达式匹配这个固定模式,一次性把所有符合的密钥都抓出来。

基础实现代码

先看单个字符串的提取示例:

$string = "Hello ##USERNAME##, your subscription is closing by tomorrow. Please renew your subscription before ##EXPIRYDATE##. Thank You.";

// 正则匹配所有##包裹的密钥
preg_match_all('/##([A-Z_]+)##/', $string, $matches);

// 提取到的纯密钥会存储在$matches[1]数组中
$extractedKeys = $matches[1];

// 输出结果
print_r($extractedKeys);

运行这段代码会输出:

Array
(
    [0] => USERNAME
    [1] => EXPIRYDATE
)

适配更多场景的封装函数

如果要处理大量不同的字符串,或者密钥可能包含小写字母、数字,建议把逻辑封装成函数,还可以顺便去重:

function extractPlaceholderKeys(string $text): array {
    // 调整正则规则,支持大小写字母、数字和下划线
    preg_match_all('/##([A-Za-z0-9_]+)##/', $text, $matches);
    
    // 处理可能的空匹配,同时去重避免重复密钥
    return array_unique($matches[1] ?? []);
}

// 测试多个字符串的情况
$sampleStrings = [
    "Hello ##USERNAME##, your support ticket ##TICKETID## has been submitted.",
    "Your outstanding balance is ##DUEAMOUNT##, please pay before ##DUEDATE##.",
    "##USERNAME##, your order ##ORDERID## has been shipped!"
];

foreach ($sampleStrings as $str) {
    $keys = extractPlaceholderKeys($str);
    echo "从字符串中提取到的密钥:" . implode(', ', $keys) . PHP_EOL;
}

正则规则说明

  • ##:匹配占位符前后的固定分隔符
  • ([A-Za-z0-9_]+):捕获组,匹配密钥的核心内容,这里支持大小写字母、数字和下划线,如果你的密钥有其他特殊字符,直接修改这个部分即可
  • preg_match_all:会遍历整个字符串,找出所有符合模式的内容,比preg_match更适合批量提取

如果需要保留完整的##KEY##格式(而不是纯密钥名),只要去掉捕获组,修改正则为/##[A-Za-z0-9_]+##/,然后取$matches[0]数组即可。

内容的提问来源于stack exchange,提问作者Manikandan Vaidhyanathan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:31:20