]+>'; // 匹配已有的定界符 $existingDelimiterPattern = '(?:\$\$[\s\S]*?\$\$|\$[\s\S]*?\$|\\\\\([\s\S]*?\\\\\)|\\\\\[[\s\S]*?\\\\\])'; // 数学公式特征: // 1. 函数定义: f(x) = ... // 2. 等式/不等式: ... = ..., ... > ..., ... < ... // 3. 包含 LaTeX 命令: \sqrt, \frac 等 // 4. 包含上标/下标: x^2, a_n // 匹配函数定义或等式 (例如 f(x) = 2x^2 + 1) // 必须包含 = 或 > 或 <,且周围有类数学字符 $equationPattern = '(?]\s*[\w\s\+\-\*\/\^\.\(\)\{\}\\\\]+(?=\s|$|<|[.,;])'; // 匹配显式 LaTeX 命令 (例如 \sqrt{...}) $latexPattern = '\\\\[a-zA-Z]+(?:\{[^\}]*\})?'; // 匹配简单的代数项 (例如 x^2, a_n) - 需谨慎,避免匹配普通单词 $algebraPattern = '(?', '^', '_', '{', '}']; foreach ($symbols as $symbol) { if (strpos($content, $symbol) !== false) { // 排除普通文本中的符号(如连字符),这里做一个简单的宽容判断 // 如果有数字紧随其后,或者是特定组合 return true; } } // 3. 检查数字和字母的组合 (如 2x, x^2) if (preg_match('/[a-zA-Z]\d|\d[a-zA-Z]/', $content)) { return true; } return false; } /** * 批量处理 */ public static function processArray(array $data, array $fieldsToProcess): array { foreach ($data as $key => &$value) { if (in_array($key, $fieldsToProcess) && is_string($value)) { $value = self::processFormulas($value); } elseif (is_array($value)) { $value = self::processArray($value, $fieldsToProcess); } } return $data; } /** * 处理题目数据 */ public static function processQuestionData(array $question): array { $fieldsToProcess = [ 'stem', 'content', 'question_text', 'answer', 'correct_answer', 'student_answer', 'explanation', 'solution', 'question_content' ]; return self::processArray($question, $fieldsToProcess); } }