ソースを参照

优化了拆分章节的正则

lh 3 ヶ月 前
コミット
776f54182a
1 ファイル変更43 行追加10 行削除
  1. 43 10
      app/Services/DeepSeek/DeepSeekService.php

+ 43 - 10
app/Services/DeepSeek/DeepSeekService.php

@@ -8911,22 +8911,55 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
         // 根据章节标题来拆分章节内容,返回包含标题和内容的二维数组
         $chapters = [];
         
-        // 匹配不同格式的章节标题:###第X章、##第X章、第X章、###第X集、##第X集、第X集
-        $pattern = '/^(#{0,3}\s*第[^章集]*[章集][^\n]*)\n(.*?)(?=\n#{0,3}\s*第[^章集]*[章集]|\z)/ms';
-        
-        if (preg_match_all($pattern, $content, $matches, PREG_SET_ORDER)) {
-            foreach ($matches as $match) {
-                $title = trim($match[1], "# \t\n\r\0\x0B"); // 去除标题前的#号和空白字符
-                $chapterContent = trim($match[2]); // 去除内容前后的空白字符
+        // 匹配章节标题格式:
+        // 1. 标题独占一行
+        // 2. 格式支持:
+        //    - **第一集**
+        //    - 第一集:
+        //    - ###第1章 重生
+        //    - ##第2章 相救
+        //    - 第三章 共处一室
+        // 3. 支持阿拉伯数字(0-9)和中文数字(一二两三四五六七八九十百千万)
+        // 4. 支持章节关键字:章、节、集、幕、场、回、话
+        // 5. "第"字与数字、数字与章节关键字之间可能有空格
+        // 6. 前后可能有#、*、·等修饰符号,后面可能有冒号、空格、标题文字等
+        $pattern = '/^[#*·\s\-_=]*第\s*([一二两三四五六七八九十百千万0-9]+)\s*([章节集幕场回话]).*$/mu';
+        
+        // 先用正则找出所有章节标题的位置
+        if (preg_match_all($pattern, $content, $matches, PREG_OFFSET_CAPTURE)) {
+            $titleCount = count($matches[0]);
+            
+            for ($i = 0; $i < $titleCount; $i++) {
+                // 获取当前章节标题
+                $titleLine = trim($matches[0][$i][0]);
+                // 去除标题开头的特殊符号
+                $cleanTitle = preg_replace('/^[#*·\-_=\s]+/', '', $titleLine);
+                // 去除标题结尾的冒号
+                $cleanTitle = preg_replace('/[#*·::\s]+$/', '', $cleanTitle);
+                $cleanTitle = trim($cleanTitle);
+                
+                // 获取当前标题的结束位置
+                $titleEndPos = $matches[0][$i][1] + strlen($matches[0][$i][0]);
+                
+                // 获取下一个章节标题的开始位置(如果存在)
+                $nextTitlePos = ($i < $titleCount - 1) ? $matches[0][$i + 1][1] : strlen($content);
                 
-                if (!empty($title) && !empty($chapterContent)) {
+                // 提取章节内容(从标题结束到下一个标题开始)
+                $chapterContent = substr($content, $titleEndPos, $nextTitlePos - $titleEndPos);
+                // 清理内容:去除前后空白和分隔线
+                $chapterContent = trim($chapterContent);
+                $chapterContent = preg_replace('/^[\-\s]+/u', '', $chapterContent);
+                $chapterContent = preg_replace('/[\-\s]+$/u', '', $chapterContent);
+                
+                if (!empty($cleanTitle) && !empty($chapterContent)) {
                     $chapters[] = [
-                        'title' => $title,
+                        'title' => $cleanTitle,
                         'content' => $chapterContent
                     ];
                 }
             }
-        }else {
+        } else {
+            // 如果没有匹配到章节,返回整个内容
             $chapters[] = [
                 'title' => '',
                 'content' => $content