<?php
 namespace TechOnline\Utils; class XKeywordsUtil { public static function match($keywords, $content, &$matKeyword = null) { $keywords = trim($keywords); if (empty($keywords)) { return false; } $list = explode(',', $keywords); foreach ($list as $item) { if (false !== strpos($content, $item)) { $matKeyword = $item; return true; } else if (substr($item, 0, 1) === '@') { if (@preg_match('/' . substr($item, 1) . '/', $content)) { $matKeyword = $item; return true; } } else if (false !== strpos($item, ' ')) { $allMatch = true; foreach (explode(' ', $item) as $k) { if (false === strpos($content, $k)) { $allMatch = false; break; } } if ($allMatch) { $matKeyword = $item; return true; } } else if (preg_match('/((\\*)(\\d+))[^\\d]/', $item, $mat)) { $ks = explode($mat[1], $item); $regx = '/' . preg_quote($ks[0]) . '.{3,' . $mat[3] * 3 . '}' . preg_quote($ks[1]) . '/'; if (@preg_match($regx, $content)) { $matKeyword = $item; return true; } } else if (false !== strpos($item, '*')) { $ks = explode('*', $item); $regx = '/' . preg_quote($ks[0]) . '.+' . preg_quote($ks[1]) . '/'; if (@preg_match($regx, $content)) { $matKeyword = $item; return true; } } } return false; } public static function description() { $text = <<< TEXT
正则类型
- 简单包含匹配: "你好" 匹配 "你好"多条使用,分割
- 同时包含匹配: "你 好" 匹配 "你们好"、"你们好"、"很好你们"
- 广泛包含匹配: "你*好" 匹配 "你们好"、"你们很好"，*匹配一个或多个
- 限制匹配: "你*1好" 匹配 "你们好"，不能匹配"你们很好"，数字表示最长多少个汉字字符，1个汉字=3英文字母
- 标准正则："@正则表达式" 匹配 "正则表达式"，@开头表示正则表达式
使用说明
- 多个正则使用半角逗号,分割
TEXT;
return $text; } public static function test() { $tests = [ '你好', '你好', '你好', '你们好', '你 好', '你们好', '你*好', '你们好', '你*1好', '你们好', '你*1好', '你们很好', '你*2好', '你们很好', '@你们', '你们很好', '@你好', '你们很好', ]; $results = []; for ($i = 0; $i < count($tests); $i += 2) { $results[] = sprintf('%-10s%-20s%s', $tests[$i], $tests[$i + 1], json_encode(self::match($tests[$i], $tests[$i + 1]))); } return join("\n", $results); } }