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
相关产品推荐
相关产品推荐

