|
|
@@ -146,8 +146,27 @@
|
|
|
// 先处理LaTeX格式的underline命令
|
|
|
$renderedStem = preg_replace('/\\\underline\{[^}]*\}/', $blankSpan, $renderedStem);
|
|
|
$renderedStem = preg_replace('/\\\qquad+/', $blankSpan, $renderedStem);
|
|
|
- // 再处理普通占位符
|
|
|
+ // 【修复】在处理填空占位符时,保护LaTeX公式不被破坏
|
|
|
+ // 先标记LaTeX公式区域
|
|
|
+ $latexPlaceholders = [];
|
|
|
+ $counter = 0;
|
|
|
+ $renderedStem = preg_replace_callback('/\$[^$]+\$/u', function($matches) use (&$latexPlaceholders, &$counter, $blankSpan) {
|
|
|
+ $placeholder = '<<<LATEX_' . $counter . '>>>';
|
|
|
+ $latexPlaceholders[$placeholder] = $matches[0];
|
|
|
+ $counter++;
|
|
|
+ return $placeholder;
|
|
|
+ }, $renderedStem);
|
|
|
+
|
|
|
+ // 现在处理普通占位符(不会破坏LaTeX公式)
|
|
|
$renderedStem = preg_replace(['/(\s*)/u', '/\(\s*\)/', '/_{2,}/'], $blankSpan, $renderedStem);
|
|
|
+
|
|
|
+ // 恢复LaTeX公式(并进行HTML实体编码防止被浏览器解析)
|
|
|
+ foreach ($latexPlaceholders as $placeholder => $latexContent) {
|
|
|
+ $encodedLatex = htmlspecialchars($latexContent, ENT_QUOTES | ENT_HTML5, 'UTF-8');
|
|
|
+ $renderedStem = str_replace($placeholder, $encodedLatex, $renderedStem);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果没有占位符,在末尾添加
|
|
|
if ($renderedStem === $stemLine) {
|
|
|
$renderedStem .= ' ' . $blankSpan;
|
|
|
}
|
|
|
@@ -200,9 +219,14 @@
|
|
|
<div class="question-lead spacer"></div>
|
|
|
<div class="{{ $optionsClass }}">
|
|
|
@foreach($options as $optIndex => $opt)
|
|
|
- @php $label = chr(65 + (int)$optIndex); @endphp
|
|
|
+ @php
|
|
|
+ $label = chr(65 + (int)$optIndex);
|
|
|
+ // 对LaTeX公式中的特殊字符进行HTML实体编码,防止被浏览器当作HTML标签处理
|
|
|
+ $encodedOpt = htmlspecialchars($opt, ENT_QUOTES | ENT_HTML5, 'UTF-8');
|
|
|
+ $renderedOpt = $mathProcessed ? $encodedOpt : \App\Services\MathFormulaProcessor::processFormulas($encodedOpt);
|
|
|
+ @endphp
|
|
|
<div class="option option-compact">
|
|
|
- <strong>{{ $label }}.</strong> {!! $mathProcessed ? $opt : \App\Services\MathFormulaProcessor::processFormulas($opt) !!}
|
|
|
+ <strong>{{ $label }}.</strong> {!! $renderedOpt !!}
|
|
|
</div>
|
|
|
@endforeach
|
|
|
</div>
|
|
|
@@ -254,12 +278,29 @@
|
|
|
$blankSpan = '<span style="display:inline-block; min-width:80px; border-bottom:1.2px dashed #444; vertical-align:bottom;"> </span>';
|
|
|
// 【修复】扩展下划线转换规则,支持LaTeX格式和多种占位符
|
|
|
$renderedContent = $q->content;
|
|
|
- // 先处理LaTeX格式的underline命令
|
|
|
- $renderedContent = preg_replace('/\\\underline\{[^}]*\}/', $blankSpan, $renderedContent);
|
|
|
- $renderedContent = preg_replace('/\\\qquad+/', $blankSpan, $renderedContent);
|
|
|
- // 再处理普通占位符
|
|
|
+ // 【修复】在处理填空占位符时,保护LaTeX公式不被破坏
|
|
|
+ // 先标记LaTeX公式区域(支持包含反斜杠和花括号的LaTeX命令)
|
|
|
+ $latexPlaceholders = [];
|
|
|
+ $counter = 0;
|
|
|
+ $renderedContent = preg_replace_callback('/\$(?:[^\$]|\\.)*\$/u', function($matches) use (&$latexPlaceholders, &$counter, $blankSpan) {
|
|
|
+ $placeholder = '<<<LATEX_FILL_' . $counter . '>>>';
|
|
|
+ $latexPlaceholders[$placeholder] = $matches[0];
|
|
|
+ $counter++;
|
|
|
+ return $placeholder;
|
|
|
+ }, $renderedContent);
|
|
|
+
|
|
|
+ // 现在处理普通占位符(不会破坏LaTeX公式)
|
|
|
$renderedContent = preg_replace(['/(\s*)/u', '/\(\s*\)/', '/_{2,}/'], $blankSpan, $renderedContent);
|
|
|
- if ($renderedContent === $q->content) {
|
|
|
+
|
|
|
+ // 恢复LaTeX公式(并进行HTML实体编码防止被浏览器解析)
|
|
|
+ foreach ($latexPlaceholders as $placeholder => $latexContent) {
|
|
|
+ $encodedLatex = htmlspecialchars($latexContent, ENT_QUOTES | ENT_HTML5, 'UTF-8');
|
|
|
+ $renderedContent = str_replace($placeholder, $encodedLatex, $renderedContent);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果没有占位符且内容没有变化,在末尾添加
|
|
|
+ // 但要检查是否已经有填空占位符(如\underline{\qquad})
|
|
|
+ if ($renderedContent === $q->content && !preg_match('/\\\\underline|\\\\qquad|(\s*)|\(\s*\)/', $renderedContent)) {
|
|
|
$renderedContent .= ' ' . $blankSpan;
|
|
|
}
|
|
|
$renderedContent = $mathProcessed ? $renderedContent : \App\Services\MathFormulaProcessor::processFormulas($renderedContent);
|