PHP函数/工具需求:检测字符串含数字及样本匹配位置与来源
嘿,我来帮你搞定这两个PHP需求,直接上实用的代码和说明:
1. 检测字符串中是否包含数字
这个需求很简单,用正则表达式就能快速实现,我写了个简洁的函数:
function hasNumber(string $str): bool { // 正则匹配任意单个数字,找到就返回true return preg_match('/\d/', $str) === 1; } // 测试一下 var_dump(hasNumber("Hello 123 World")); // 输出 bool(true) var_dump(hasNumber("纯文字内容")); // 输出 bool(false)
原理很直白:/\d/ 是正则里匹配任意单个数字的元字符,preg_match 如果找到匹配就返回1,否则返回0,这样就能轻松判断字符串里有没有数字了。
2. 检测长字符串是否包含样本数组元素并返回匹配信息
针对你给出的示例,我写了一个支持通配符的函数(默认用#作为通配符,匹配一个或多个数字),能返回匹配到的样本、文本内容和起始位置:
function findSampleMatch(string $longStr, array $samples, string $wildcard = '#', string $wildcardPattern = '\d+'): array { $matchResults = []; foreach ($samples as $sample) { // 先转义样本里的正则特殊字符,避免干扰匹配 $escapedSample = preg_quote($sample, '/'); // 把通配符替换成指定的正则模式(默认匹配数字) $regexPattern = str_replace(preg_quote($wildcard, '/'), $wildcardPattern, $escapedSample); $regexPattern = "/$regexPattern/"; // 执行匹配,同时获取匹配文本的起始位置 if (preg_match($regexPattern, $longStr, $matches, PREG_OFFSET_CAPTURE)) { $matchResults[] = [ 'origin_sample' => $sample, 'matched_text' => $matches[0][0], 'start_position' => $matches[0][1] ]; } } return $matchResults; } // 用你的示例测试 $longString = "Lorem ipsum dolor 123 SAMPLE sit amet, consectetur."; $sampleArray = ["# SAMPLE", "SAMPLE #"]; $results = findSampleMatch($longString, $sampleArray); print_r($results);
运行这个代码后,你会得到这样的输出:
Array ( [0] => Array ( [origin_sample] => # SAMPLE [matched_text] => 123 SAMPLE [start_position] => 19 ) )
完全符合你要的效果!如果需要让通配符#匹配其他内容(比如任意非空白字符),只需要调用函数时传入自定义的$wildcardPattern参数就行,比如:
// 让#匹配任意非空白字符 $results = findSampleMatch($longString, $sampleArray, '#', '\S+');
内容的提问来源于stack exchange,提问作者MrBartusek
相关产品推荐
相关产品推荐

