×
¥
查看详情

下面按“基础解析”的深度,对该正则进行逐段拆解,并说明它能匹配的字符串类型。正则与标志位如下: (?xm) ^ (?[A-Za-z0-9]+(?:[._%+-][A-Za-z0-9]+)) @ (?[A-Za-z0-9-]+(?:.[A-Za-z0-9-]+)) . (?[A-Za-z]{2,}) $

一、标志位 (?xm)

  • x(自由空白模式):正则中的空白字符和换行会被忽略(字符类 [] 内的空白不受影响),方便把长正则分多行书写和加注释。
  • m(多行模式):^ 和 $ 会匹配每一行的行首与行尾,而不是整个文本的开头和结尾。这使该模式适合一次性在多行文本中逐行匹配邮箱。

二、整体结构(按顺序)

  • ^ 与 $:要求整行必须完全符合邮箱格式(行首到行尾都被匹配)。
  • (?...): 命名捕获组 local,匹配邮箱的本地部分(@ 前)。
  • @:字面量 at 符号。
  • (?...): 命名捕获组 domain,匹配域名的主体部分(不含最终的顶级域)。
  • .:字面量点,分隔 domain 与 tld。
  • (?...): 命名捕获组 tld,匹配顶级域(TLD)。

三、各部分细化

  1. 本地部分 local
  • 模式:[A-Za-z0-9]+(?:[._%+-][A-Za-z0-9]+)*
  • 含义:
    • 先以一个或多个字母/数字开头。
    • 后面可以出现零次或多次由“一个分隔符 + 一段字母/数字”组成的片段。
    • 分隔符允许的字符为 . _ % + -。
  • 影响:
    • 不允许以分隔符开头或结尾(因为两端都要求是字母/数字)。
    • 不允许出现连续的分隔符(因为分隔符后必须跟一段字母/数字)。
    • 允许如 user.name、dev_42、alpha-beta、name+tag 等形式。
  1. 域名主体 domain
  • 模式:[A-Za-z0-9-]+(?:.[A-Za-z0-9-]+)*
  • 含义:
    • 由一个或多个“标签”用点连接而成;每个标签由字母/数字/连字符 - 组成。
    • 至少一个标签,且可有子域(通过点连接)。
  • 影响:
    • 不允许出现两个连续的点(因为点后必须跟一段字母/数字/-)。
    • 允许连字符出现在标签任意位置(包括开头或结尾),这比真实域名规则更宽松(真实域名通常不允许标签以 - 开头或结尾,但此处未限制)。
    • 不允许下划线 _ 出现在域名中。
  1. 顶级域 tld
  • 模式:[A-Za-z]{2,}
  • 含义:
    • 至少两个英文字母。
  • 影响:
    • 不允许数字或连字符出现在 TLD 中(如 xn--、123 不行)。
    • 可匹配常见 TLD:com、org、io、co、net、museum 等(只要是字母且长度≥2)。

四、它能匹配的字符串类型(概括)

  • 形式:local@domain.tld
  • local:由字母/数字块,使用 . _ % + - 作为分隔符分段,且不以分隔符开头或结尾,不允许连续分隔符。
  • domain:一个或多个由英数或 - 构成的标签,用点连接;不允许连续的点;不允许下划线。
  • tld:全字母,长度至少 2。
  • 整体必须占满整行(受 ^ 和 $ 约束;在多行文本中逐行验证)。

五、与示例的匹配结果 给定三行目标文本(多行模式下逐行检查):

  1. user.name+tag@notes.example.org
  • 匹配成功
    • local = user.name+tag
    • domain = notes.example
    • tld = org
  1. dev_42@test.io
  • 匹配成功
    • local = dev_42
    • domain = test
    • tld = io
  1. alpha-beta@sub.domain.co
  • 匹配成功
    • local = alpha-beta
    • domain = sub.domain
    • tld = co

六、典型能/不能匹配的额外例子(帮助理解)

总结:该正则是一个“简化且实用”的邮箱匹配与分组提取模式,适用于常见英文与数字构成的邮箱地址场景,并提供 local、domain、tld 三个命名分组以便直接获取各部分。它并不完全覆盖 RFC 规范中的所有合法邮箱形式,但能较好地拦截常见的格式错误。

下面对该正则进行逐步、详细解析,并结合示例说明匹配结果。

一、整体结构与作用概览

  • 模式开关 (?x):开启“自由空白/注释模式”(也称 free-spacing 或 verbose)。启用后,正则里的空白字符与换行(以及用 # 开头到行尾的注释)会被忽略,以便把正则写成更易读的多行形式。注意:
    • 字符类 [...] 内的空白不会被忽略。
    • 想匹配字面量空格,需要转义 \ 或放进字符类。
  • \b ... \b:两端的单词边界。确保匹配的日期是一个“独立的词片段”,不被相邻的字母/数字/下划线黏连。
  • 非捕获分组 (?: A | B ):两种日期格式二选一:
    1. YYYY-MM-DD(短横线分隔)
    2. DD/MM/YYYY(斜杠分隔)
  • 三个命名捕获组 year、month、day:无论分支选择哪一种格式,最终都把年、月、日分别捕获到这三个名字里(前提是引擎允许重复的命名组名,见兼容性说明)。

二、逐段拆解

  1. \b:单词边界
  • 要求日期左边是“非单词字符”或文本开头,右边是“单词字符”;或反之。常见场景下,数字属于“单词字符”,空格、标点、中文标点都属于“非单词字符”,因此“空格2023-09-07,”能满足边界条件。
  • 注意 Unicode 语义差异:在某些引擎/模式下,汉字也可能被视为“单词字符”。如果紧挨汉字、且两边都被视为“单词字符”,\b 会失败。你当前示例里日期前有空格或标点,因此不会受影响。
  1. (?: ... | ... ) 两种格式 A. 第一种格式:YYYY-MM-DD
  • (?\d{4}):4位数字年份。
  • -:字面量短横线。
  • (?0[1-9]|1[0-2]):两位月份,01-09 或 10-12;不允许 00、不允许不补零的 1-9。
  • -:字面量短横线。
  • (?0[1-9]|[12]\d|3[01]):两位日期,01-09、10-29、30-31;不允许 00、不允许不补零的 1-9。 说明:这里只检查数值区间,未校验“大小月/闰年”,例如 2023-02-31 仍会匹配。

B. 第二种格式:DD/MM/YYYY

  • (?0[1-9]|[12]\d|3[01]):两位日期,范围同上。
  • /:字面量斜杠。
  • (?0[1-9]|1[0-2]):两位月份,范围同上。
  • /:字面量斜杠。
  • (?\d{4}):4位年份。 说明:该分支明确采用“日/月/年”的欧洲式次序,而不是“月/日/年”。因此 07/10/2023 会被解析为 day=07, month=10(即 7 日 10 月),而不是 10 日 7 月。
  1. \b:右侧单词边界
  • 确保日期右边与相邻字符之间有词边界,例如逗号、句号、空格、中文标点都可以。

三、它能匹配哪些类型的字符串

  • 两种严格的、零填充的数字日期:
    • YYYY-MM-DD(年-月-日,短横线分隔,年4位,月/日两位且必须补零)
    • DD/MM/YYYY(日/月/年,斜杠分隔,年4位,日/月两位且必须补零)
  • 年份:恰好 4 位数字(0000-9999 都会被当作有效年份,不做语义限制)。
  • 月份:01-12。
  • 日期:01-31(不校验月份天数与闰年)。
  • 不允许:
    • 不补零的 1 位月/日(如 2023-9-7、7/10/2023 中的 7 若不写成 07 就不匹配)。
    • 错误分隔符(如 2023/09/07 或 07-10-2023 不匹配)。
    • 00 月或 00 日。
    • 被字母或下划线直接黏连的情况(因为 \b)。例如 foo2023-09-07 不匹配;若希望这种情况也匹配,可改用更合适的边界约束(见下方改进建议)。

四、命名捕获组的兼容性提示

  • 该正则在两个分支里重复使用了同名捕获组 year、month、day,这是为了无论匹配哪种格式,都能用相同的组名来取值。
  • 支持情况:
    • .NET:允许同名命名组(在交替分支中常用),取值为实际匹配的那个分支的捕获。
    • PCRE/PCRE2:可通过允许重复命名(某些环境需启用允许重复命名的选项,例如 PCRE 的 J 修饰符)。取值通常为实际匹配的分支。
    • Python 内置 re、Java 等:默认不允许在同一模式中重复声明相同的命名组名,会报错。若需跨分支共享名字:
      • Python 可改用第三方 regex 模块并用 branch reset 或允许重复命名;
      • 或者使用不同名字(如 y_year/m_month/d_day 与 d_day/m_month/y_year)后在代码层合并;
      • 或使用编号分组并在代码里按分支解释。
  • 若你需要广泛兼容性,建议:
    • 使用编号分组并在代码里根据匹配的分支来映射到 year/month/day;
    • 或在 PCRE 下使用分支重置组 (?| ... ),这样各分支的同位置捕获拥有相同编号。

五、示例文本匹配演示 目标文本:发布于 2023-09-07,修订于 07/10/2023;上线计划 2024-01-15。

  • 可匹配出三个片段:
    1. 2023-09-07
      • year=2023, month=09, day=07(来自 YYYY-MM-DD 分支)
    2. 07/10/2023
      • day=07, month=10, year=2023(来自 DD/MM/YYYY 分支;即 2023 年 10 月 07 日)
    3. 2024-01-15
      • year=2024, month=01, day=15(来自 YYYY-MM-DD 分支)
  • 标点“,”和“;”不影响匹配,因为两端 \b 只要求词边界,标点是非单词字符。

六、常见边界与校验注意点

  • 词边界 \b 与上下文字符有关:如果日期左右直接紧邻字母或下划线,\b 可能导致不匹配。若想只限制与数字黏连,可改为:
    • 左侧用 (?<!\d) 保证左边不是数字;
    • 右侧用 (?!\d) 保证右边不是数字; 这样能允许与字母相邻但避免与数字连续,例如 (?<!\d)(?:...日期...)(?!\d)。
  • 该模式不做日历有效性校验(例如 02 月 30 日、闰年 2 月 29 日等),需要时应在匹配后做进一步验证,或用更复杂的正则(通常可读性差、维护成本高)。

七、简要小结

  • 这个正则以自由空白模式书写,清晰表达了两种严格零填充的数字日期格式:
    • YYYY-MM-DD(年-月-日,- 分隔)
    • DD/MM/YYYY(日/月/年,/ 分隔)
  • 通过命名组 year、month、day 输出结构化信息,并用 \b 确保日期作为独立词片段出现。
  • 不处理大小月与闰年,不接受不补零的月/日,不接受混用分隔符。对重复命名组的支持取决于具体正则引擎。

总体作用

  • 这是一个为“Markdown 行内链接”设计的正则,用来抓取形如 文本 的结构,并把“可见文本、URL、标题和所用引号”拆分到命名捕获组中。
  • 支持 http 和 https 链接;标题是可选的,且可用双引号或单引号包裹。

模式级别说明

  • (?x) 开启“自由空白/可读性模式”(free-spacing)。在该模式下,正则里的空格和换行会被忽略(除字符类 [] 内和转义场景),便于把模式分行书写和对齐。

逐段拆解(应用导向)

  • [ 和 ]:匹配 Markdown 链接的外层方括号(字面量的 [ 和 ]),包裹可见文本。
  • (?
  • ( 和 ):匹配包住 URL 与可选标题的圆括号(字面量的 ( 和 ))。
  • (?https?://[^\s)]+)
    • 命名捕获 url:以 http 或 https 开头的绝对 URL。
    • https?:// 强制是 http:// 或 https://(:// 中的斜杠是字面量)。
    • [^\s)]+ 抓取后续的 URL 主体,直到出现空白字符或 ) 为止。
    • 结果:URL 中不能有空格,也不能包含 );可以包含其它常见的 URL 字符(如 ? # & 等)。
  • (?:\s (?["']) (?.*?) \k<quote>)? <ul> <li>一个可选的非捕获组:如果 URL 后面有至少一个空白字符,就可以跟一个用引号包裹的“标题”。</li> <li>\s 要求 URL 与标题之间必须有空白(符合 Markdown 的写法)。</li> <li>(?<quote>["']) 捕获所用引号字符到 quote(可能是 " 或 ')。</li> <li>(?<title>.*?) 惰性地抓取标题文本(不跨行,直到下一个匹配的引号)。</li> <li>\k<quote> 用“命名反向引用”确保闭合引号与开头引号一致(如果开头是 ",结尾必须是 ";如果开头是 ',结尾也必须是 ')。</li> <li>结果:标题部分是可选的;若存在,必须以空白开头,并用成对且同类型的引号包裹。</li> </ul> </li> </ul> <p>能匹配的字符串类型</p> <ul> <li>标准 Markdown 行内链接: <ul> <li>没有标题:<a href="https://example.com">文本</a></li> <li>有标题(双引号):<a href="https://example.com" title="说明">文本</a></li> <li>有标题(单引号):<a href="https://example.com" title="说明">文本</a></li> </ul> </li> <li>限定为 http/https 链接。相对路径、mailto、ftp 等不会匹配。</li> <li>标签中不可包含 ] 或换行;URL 中不可包含空白或右括号 );标题中不可跨行,且不能包含与包裹它的同类引号(没有处理转义引号)。</li> </ul> <p>示例文本的匹配结果 目标文本: 请参考<a href="https://docs.example.org" title="API 说明">开发文档</a>与<a href="http://example.org">主页</a>获取更多信息。 或者看<a href="https://guide.example.net" title="快速入门">指南</a>。</p> <p>可得到三处匹配:</p> <ol> <li><a href="https://docs.example.org" title="API 说明">开发文档</a></li> </ol> <ul> <li>label = 开发文档</li> <li>url = <a href="https://docs.example.org">https://docs.example.org</a></li> <li>quote = "</li> <li>title = API 说明</li> </ul> <ol start="2"> <li><a href="http://example.org">主页</a></li> </ol> <ul> <li>label = 主页</li> <li>url = <a href="http://example.org">http://example.org</a></li> <li>quote 与 title 不存在(可选组未出现)</li> </ul> <ol start="3"> <li><a href="https://guide.example.net" title="快速入门">指南</a></li> </ol> <ul> <li>label = 指南</li> <li>url = <a href="https://guide.example.net">https://guide.example.net</a></li> <li>quote = '</li> <li>title = 快速入门</li> </ul> <p>常见应用与注意事项</p> <ul> <li>用途:把 Markdown 链接提取后,转换为 HTML <a href="url" title="title">label</a>,或做链接分析、校验。</li> <li>会匹配图片语法中的方括号部分(例如 <img src="url" alt="alt" />),因为它不检查前导的 !。如需排除图片,可在 [ 前加负向后发断言:(?<!!)[(部分引擎支持)。</li> <li>只允许 http/https。如需更通用的方案,可把 (?<url>https?://[^\s)]+) 改为 (?<url>[a-z][a-z0-9+.-]*://[^\s)]+)。</li> <li>URL 中不能出现 ),所以带未转义右括号的链接不会完全匹配(Markdown 规范允许括号但需平衡或转义)。若要支持括号,可改造为更复杂的平衡匹配,或在预处理时对 URL 进行转义。</li> <li>标题里若包含同类引号(例如 "API “说明”"),当前模式会在提前的引号处结束匹配;如需支持转义引号,可把 title 改为例如 (?<title>(?:\.|[^\])*) 并允许 " 或 '.</li> <li>语言支持:PCRE、.NET、Python(用 re.X 启用自由空白)、Ruby 等都支持 (?x) 和 \k<name> 命名反向引用;JavaScript支持命名组与 \k<name>,但不支持 (?x),需去除正则中的格式化空白后再使用。</li> </ul> </div> </div> </div> </div> </div> </section> <div id="examplePopupModal" class="prompt-examples-v4-modal"> <div class="prompt-examples-v4-modal-content"> <div class="prompt-examples-v4-modal-header"> <h3 id="popupTitle">示例详情</h3> <button class="prompt-examples-v4-modal-close" onclick="closeExamplePopup()"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> <line x1="18" y1="6" x2="6" y2="18"></line> <line x1="6" y1="6" x2="18" y2="18"></line> </svg> </button> </div> <div class="prompt-examples-v4-modal-body"> <div id="popupContent" class="prompt-examples-v4-popup-content"></div> </div> </div> </div> <script> // 弹窗功能JavaScript function showExamplePopup(exampleIndex, title, buttonElement) { const modal = document.getElementById('examplePopupModal'); const popupTitle = document.getElementById('popupTitle'); const popupContent = document.getElementById('popupContent'); // 设置弹窗标题 popupTitle.textContent = title; // 获取对应示例的内容 const tabContent = document.getElementById('example-' + exampleIndex); const outputText = tabContent.querySelector('.prompt-examples-v4-output-text'); if (outputText) { // 克隆内容到弹窗中 popupContent.innerHTML = outputText.innerHTML; } else { popupContent.innerHTML = '<p>暂无内容</p>'; } // 显示弹窗 modal.classList.add('show'); document.body.style.overflow = 'hidden'; // 防止背景滚动 } function closeExamplePopup() { const modal = document.getElementById('examplePopupModal'); modal.classList.remove('show'); document.body.style.overflow = ''; // 恢复背景滚动 } // 点击背景关闭弹窗 document.addEventListener('DOMContentLoaded', function() { const modal = document.getElementById('examplePopupModal'); if (modal) { modal.addEventListener('click', function(e) { if (e.target === modal) { closeExamplePopup(); } }); } // ESC键关闭弹窗 document.addEventListener('keydown', function(e) { if (e.key === 'Escape') { closeExamplePopup(); } }); }); </script> <script> document.addEventListener('DOMContentLoaded', function() { // Tab切换功能 const tabs = document.querySelectorAll('.prompt-examples-v4-tab'); const contents = document.querySelectorAll('.prompt-examples-v4-tab-content'); tabs.forEach(tab => { tab.addEventListener('click', function() { const targetId = this.getAttribute('data-tab'); // 移除所有active状态 tabs.forEach(t => t.classList.remove('active')); contents.forEach(c => c.classList.remove('active')); // 添加当前active状态 this.classList.add('active'); const targetContent = document.getElementById(targetId); if (targetContent) { targetContent.classList.add('active'); } }); }); }); </script> <section class="solved-problems-v4"> <div class="solved-problems-v4-container"> <h2 class="solved-problems-v4-title">解决的问题</h2> <div class="solved-problems-v4-content"> <div class="solved-problems-v4-item"> <div class="html-content-display solved-problems-v4-item-text"> <p>帮助用户逐步解析复杂的正则表达式,并通过清晰的讲解降低其理解难度,从而使用户能够更有效地掌握正则表达式的使用场景及匹配规则。</p> </div> </div> </div> </div> </section> <style> .solved-problems-v4-item > .solved-problems-v4-item-text { background-color: transparent !important; border: none !important; padding: 0 !important; } </style> <div class="suitable-users-v4"> <div class="suitable-users-v4-container"> <h2 class="suitable-users-v4-title">适用用户</h2> <div class="suitable-users-v4-list"> <div class="suitable-users-v4-card" style="background-color: #EFEBE9;"> <div class="suitable-users-v4-card-content"> <h3 class="suitable-users-v4-card-title">编程初学者</h3> <p class="suitable-users-v4-card-description">借助提示词学习正则表达式的工作原理和具体用法,快速掌握文本匹配和处理技巧,完成基础编程任务</p> </div> </div> <div class="suitable-users-v4-card" style="background-color: #FCE4EC;"> <div class="suitable-users-v4-card-content"> <h3 class="suitable-users-v4-card-title">数据工程师</h3> <p class="suitable-users-v4-card-description">用于高效解析日志文件、清洗数据或验证输入,轻松理解复杂正则规则,解决数据处理中的瓶颈</p> </div> </div> <div class="suitable-users-v4-card" style="background-color: #EFEBE9;"> <div class="suitable-users-v4-card-content"> <h3 class="suitable-users-v4-card-title">网站开发人员</h3> <p class="suitable-users-v4-card-description">生成用于验证用户输入的正则表达式,提高表单准确性和安全性,优化用户体验</p> </div> </div> </div> </div> </div> <section class="feature-summary-v4"> <div class="feature-summary-v4-container"> <h2 class="feature-summary-v4-title">特征总结</h2> <div class="feature-summary-v4-content"> <div class="feature-summary-v4-item"> <span class="feature-summary-v4-bullet">•</span> <span class="feature-summary-v4-text">逐步解析正则表达式,帮助用户清晰了解每一个组件的功能与作用</span> </div> <div class="feature-summary-v4-item"> <span class="feature-summary-v4-bullet">•</span> <span class="feature-summary-v4-text">将复杂的正则语法简单化,轻松掌握匹配规则,高效完成任务</span> </div> <div class="feature-summary-v4-item"> <span class="feature-summary-v4-bullet">•</span> <span class="feature-summary-v4-text">为每一部分提供详细说明,快速理解不同结构的匹配逻辑</span> </div> <div class="feature-summary-v4-item"> <span class="feature-summary-v4-bullet">•</span> <span class="feature-summary-v4-text">精准展示文本匹配场景,为用户明确哪些字符串可以被匹配</span> </div> <div class="feature-summary-v4-item"> <span class="feature-summary-v4-bullet">•</span> <span class="feature-summary-v4-text">提升正则表达式学习效率,让初学者也能迅速上手应用</span> </div> <div class="feature-summary-v4-item"> <span class="feature-summary-v4-bullet">•</span> <span class="feature-summary-v4-text">支持多领域应用场景,从数据处理到文本校验均可轻松应对</span> </div> <div class="feature-summary-v4-item"> <span class="feature-summary-v4-bullet">•</span> <span class="feature-summary-v4-text">解决技术门槛问题,让非技术人员也能轻松生成并使用正则表达式</span> </div> <div class="feature-summary-v4-item"> <span class="feature-summary-v4-bullet">•</span> <span class="feature-summary-v4-text">直观呈现正则式的作用,助力用户优化代码及文本匹配效率</span> </div> </div> </div> </section> <section class="usage-guide-v4"> <div class="usage-guide-v4-container"> <h2 class="usage-guide-v4-title">如何使用购买的提示词模板</h2> <div class="usage-guide-v4-content"> <div class="usage-guide-v4-item"> <div class="usage-guide-v4-text"> <h4 class="usage-guide-v4-subtitle">1. 直接在外部 Chat 应用中使用</h4> <p class="usage-guide-v4-description">将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。</p> <div class="usage-guide-v4-icons"> <a href="https://chat.deepseek.com/" target="_blank" class="usage-guide-v4-icon-item"> <img src="https://explinks-prod-apis.oss-cn-beijing.aliyuncs.com/apiDefaultIconADI20240909773605e9f9b1.png" alt="DeepSeek" class="usage-guide-v4-icon"> </a> <a href="https://www.doubao.com/chat/" target="_blank" class="usage-guide-v4-icon-item"> <img src="https://explinks-prod-apis.oss-cn-beijing.aliyuncs.com/apiDefaultIconADI20240909336605e9c295.png" alt="豆包" class="usage-guide-v4-icon"> </a> <a href="https://www.tongyi.com/" target="_blank" class="usage-guide-v4-icon-item"> <img src="https://explinks-prod-apis.oss-cn-beijing.aliyuncs.com/apiDefaultIcon9f8a29a9-4e4f-49ab-ac0d-7985823a6f0c.png" alt="通义" class="usage-guide-v4-icon"> </a> <a href="https://www.kimi.com/" target="_blank" class="usage-guide-v4-icon-item"> <img src=" https://explinks-prod-apis.oss-cn-beijing.aliyuncs.com/LOGO_IMG/579c8d7f234543b2832c95c5ddb38515" alt="Kimi" class="usage-guide-v4-icon"> </a> <a href="https://chatgpt.com/" target="_blank" class="usage-guide-v4-icon-item"> <img src=" https://explinks-prod-apis.oss-cn-beijing.aliyuncs.com/LOGO_IMG/cc5204a95abd46b2b603c9c0101b4ef0" alt="ChatGPT" class="usage-guide-v4-icon"> </a> <a href="https://grok.com/" target="_blank" class="usage-guide-v4-icon-item"> <img src="https://explinks-prod-apis.oss-cn-beijing.aliyuncs.com/LOGO_IMG/b84a84ef3daf43649d3fdbee8f170992" alt="Grok" class="usage-guide-v4-icon"> </a> <a href="https://gemini.google.com/" target="_blank" class="usage-guide-v4-icon-item"> <img src="https://explinks-prod-apis.oss-cn-beijing.aliyuncs.com/LOGO_IMG/57840102146847898b70184c9ee87aff" alt="Gemini" class="usage-guide-v4-icon"> </a> </div> </div> </div> <div class="usage-guide-v4-item"> <div class="usage-guide-v4-text"> <h4 class="usage-guide-v4-subtitle">2. 发布为 API 接口调用</h4> <p class="usage-guide-v4-description">把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。 </div> </div> <div class="usage-guide-v4-item"> <div class="usage-guide-v4-text"> <h4 class="usage-guide-v4-subtitle">3. 在 MCP Client 中配置使用</h4> <p class="usage-guide-v4-description">在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。 </p> </div> </div> </div> </div> </section> </div> <div class="prompt-detail-v4-right"> <div class="prompt-info-right"> <div class="chip-list"> <a href="/search?biz_cat_slug=education" class="chip chip-member"> 教育 </a> <a href="/search?ai_ability=text_to_code" class="chip"> 文生代码 </a> <span class="chip">AI提示词</span> </div> <h1 class="prompt-actions-title">正则表达式解析与教学</h1> <div class="meta-row"> <div class="author-info"> <img src="https://static.explinks.com/prompt/static/images/common/explinks_logo.jpg" alt="幂简官方" class="author-avatar"> <a href="" class="author-name">幂简官方</a> </div> <div class="stats-info"> <div class="stat-item"> <svg xmlns="http://www.w3.org/2000/svg" class="icon" viewBox="0 0 1228 1024" width="16" height="16"><path d="M614.4 1024C276.48 1024 0 798.72 0 512S276.48 0 614.4 0s614.4 225.28 614.4 512-276.48 512-614.4 512z m0-102.4c286.72 0 512-184.32 512-409.6s-225.28-409.6-512-409.6S102.4 286.72 102.4 512s225.28 409.6 512 409.6z m0-153.6c-143.36 0-256-112.64-256-256s112.64-256 256-256 256 112.64 256 256-112.64 256-256 256z m0-102.4c87.04 0 153.6-66.56 153.6-153.6s-66.56-153.6-153.6-153.6-153.6 66.56-153.6 153.6 153.6 153.6z" fill="#8a8a8a"/></svg> <span>575</span> </div> <div class="stat-item"> <svg xmlns="http://www.w3.org/2000/svg" class="icon" viewBox="0 0 1024 1024" width="16" height="16"><path d="M772.7 217.7a32.2 32.1 0 1 0 64.4 0 32.2 32.1 0 1 0-64.4 0Z" fill="#8a8a8a"/><path d="M415.8 679.9c5.9 0 11.5-1.6 16.2-4.5l231.1-134.6c10.9-5.2 18.5-16.3 18.5-29.2 0-11.9-6.4-22.3-16-27.8L439.7 352.2c-5.8-6.7-14.4-10.9-23.9-10.9-17.6 0-31.8 14.4-31.8 32.1 0 0.6 0 1.2 0.1 1.8l-0.4 0.2 0.5 269c-0.1 1.1-0.2 2.2-0.2 3.4 0 17.7 14.3 32.1 31.8 32.1z" fill="#8a8a8a"/><path d="M909.8 306.6c-5.4-10.5-16.3-17.8-28.9-17.8-17.8 0-32.2 14.4-32.2 32.1 0 6 1.7 11.7 4.6 16.5l-0.1 0.1c26.9 52.4 42.1 111.8 42.1 174.7 0 211.6-171.6 383.2-383.2 383.2S128.8 723.8 128.8 512.2 300.4 129.1 512 129.1c62.5 0 121.5 15 173.6 41.5l0.2-0.4c4.6 2.6 10 4.1 15.7 4.1 17.8 0 32.2-14.4 32.2-32.1 0-13.1-7.9-24.4-19.3-29.4C653.6 81.9 584.9 64.5 512 64.5 264.7 64.5 64.3 265 64.3 512.2S264.7 959.9 512 959.9s447.7-200.4 447.7-447.7c0-74.1-18-144-49.9-205.6z" fill="#8a8a8a"/></svg> <span>61</span> </div> </div> <div class="update-time"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="16" height="16"><path d="M512 929.959184c-230.4 0-417.959184-187.559184-417.959184-417.959184s187.559184-417.959184 417.959184-417.959184 417.959184 187.559184 417.959184 417.959184-187.559184 417.959184-417.959184 417.959184z m0-794.122449c-207.412245 0-376.163265 168.75102-376.163265 376.163265s168.75102 376.163265 376.163265 376.163265 376.163265-168.75102 376.163265-376.163265-168.75102-376.163265-376.163265-376.163265z"/><path d="M718.367347 538.122449h-208.979592c-11.493878 0-20.897959-9.404082-20.897959-20.897959s9.404082-20.897959 20.897959-20.897959h208.979592c11.493878 0 20.897959 9.404082 20.897959 20.897959s-9.404082 20.897959-20.897959 20.897959z"/><path d="M509.387755 538.122449c-11.493878 0-20.897959-9.404082-20.897959-20.897959V256c0-11.493878 9.404082-20.897959 20.897959-20.897959s20.897959 9.404082 20.897959 20.897959v261.22449c0 11.493878-9.404082 20.897959-20.897959 20.897959z"/></svg> <span>Dec 8, 2025</span> </div> </div> <div class="intro-text"> 本提示词旨在将复杂的正则表达式语法进行系统性拆解与教学。它通过逐步解析每个组件,清晰地解释其匹配规则与功能,帮助用户深入理解正则表达式的构造逻辑与文本匹配能力,适用于编程学习、文本处理规则制定及代码审查等场景。 </div> <div class="content-wrapper" id="contentWrapper"> <div class="copy-box locked" id="contentBox"> <div class="copy-content" id="promptContentArea"> </div> <div class="copy-actions"> <a class="copy-btn hidden" id="copyBtn" href="javascript:void(0)" aria-label="复制提示词"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" aria-hidden="true" width="16" height="16"> <path fill="currentColor" d="M320 128h448v448H320z"/> <path fill="currentColor" d="M256 256h448v448H256z"/> </svg> <span>复制提示词</span> </a> <a class="view-content-btn" id="viewContentBtn" href="javascript:void(0)"> 查看提示词内容 </a> </div> <div class="copy-overlay" id="blurOverlay"></div> </div> <div class="content-fade-overlay hidden" id="contentFadeOverlay"></div> <a class="toggle-expand-btn hidden" id="toggleExpandBtn" href="javascript:void(0)">展开全部 ▼</a> </div> <a href="/user/vip" target="_blank" class="member-promo-card"> <div class="promo-text"> <div class="promo-title">成为会员,解锁全站资源</div> <div class="promo-subtitle">复制与查看不限次 · 持续更新权益</div> </div> <span class="promo-link-arrow">→</span> </a> </div> <script> document.addEventListener('DOMContentLoaded', function() { loadPromptContent(); }); async function loadPromptContent() { const slug = 'regex_parsing_rules'; const contentArea = document.getElementById('promptContentArea'); const viewBtn = document.getElementById('viewContentBtn'); const copyBtn = document.getElementById('copyBtn'); const overlay = document.getElementById('blurOverlay'); const contentBox = document.getElementById('contentBox'); // 获取登录 token const token = (function() { const m = document.cookie.match(/(?:^|; )Admin-Token=([^;]+)/); return m ? decodeURIComponent(m[1]) : null; })(); const headers = { 'Content-Type': 'application/json' }; if (token) { headers['Authorization'] = token.indexOf('Bearer ') === 0 ? token : ('Bearer ' + token); } try { // 请求开始前禁用按钮 if (viewBtn) { viewBtn.style.pointerEvents = 'none'; viewBtn.style.opacity = '0.6'; viewBtn.textContent = '加载中...'; } const baseUrl = "https://prompts-api.explinks.com"; const response = await fetch(baseUrl + '/prompt-detail/content/' + slug, { method: 'POST', headers: headers, credentials: 'include' }); const data = await response.json(); if (data.success) { const content = data.data.content; const accessLevel = data.data.accessLevel; const loggedIn = data.data.loggedIn; contentArea.textContent = content; if (accessLevel === 'full') { // 完整权限 contentBox.classList.remove('locked'); overlay.style.display = 'none'; viewBtn.style.display = 'none'; copyBtn.classList.remove('hidden'); // 绑定复制事件 copyBtn.onclick = function(e) { e.preventDefault(); copyTextToClipboard(content, () => showToast('复制成功')); }; // 长内容折叠处理 const fadeOverlay = document.getElementById('contentFadeOverlay'); const toggleBtn = document.getElementById('toggleExpandBtn'); const MAX_COLLAPSED_HEIGHT = 200; requestAnimationFrame(function() { if (contentArea.scrollHeight > MAX_COLLAPSED_HEIGHT) { contentBox.classList.add('collapsed'); fadeOverlay.classList.remove('hidden'); toggleBtn.classList.remove('hidden'); let expanded = false; toggleBtn.onclick = function(e) { e.preventDefault(); expanded = !expanded; if (expanded) { contentBox.classList.remove('collapsed'); fadeOverlay.classList.add('hidden'); toggleBtn.textContent = '收起 ▲'; } else { contentBox.classList.add('collapsed'); fadeOverlay.classList.remove('hidden'); toggleBtn.textContent = '展开全部 ▼'; } }; } }); } else if (!loggedIn) { // 未登录:引导登录 contentBox.classList.add('locked'); overlay.style.display = 'block'; viewBtn.style.pointerEvents = 'auto'; viewBtn.style.opacity = '1'; viewBtn.textContent = '登录后查看完整内容'; viewBtn.href = 'javascript:void(0)'; viewBtn.onclick = function(e) { e.preventDefault(); if (typeof openLoginDialog === 'function') { openLoginDialog(function() { // 登录成功后重新加载内容 loadPromptContent(); }); } }; } else { // 已登录但无权限:引导开会员 contentBox.classList.add('locked'); overlay.style.display = 'block'; viewBtn.style.pointerEvents = 'auto'; viewBtn.style.opacity = '1'; viewBtn.textContent = '查看提示词内容'; viewBtn.href = '/user/vip'; viewBtn.onclick = null; // 清除之前的登录点击事件 } } } catch (e) { console.error('Failed to load content', e); // 请求失败,恢复按钮状态 if (viewBtn) { viewBtn.style.pointerEvents = 'auto'; viewBtn.style.opacity = '1'; viewBtn.textContent = '加载失败,重试'; viewBtn.onclick = function() { loadPromptContent(); }; } } } // Toast 提示 function showToast(message) { let toast = document.getElementById('toast-notification'); if (!toast) { toast = document.createElement('div'); toast.id = 'toast-notification'; toast.className = 'toast-notification'; toast.innerHTML = '<i class="fa fa-check-circle"></i> <span></span>'; document.body.appendChild(toast); } toast.querySelector('span').textContent = message; toast.classList.add('show'); if (toast.timeoutId) clearTimeout(toast.timeoutId); toast.timeoutId = setTimeout(() => { toast.classList.remove('show'); }, 2000); } // 复制内容 function copyTextToClipboard(text, onSuccess) { const handleSuccess = () => { if (onSuccess && typeof onSuccess === 'function') { onSuccess(); } }; if (navigator.clipboard && window.isSecureContext) { navigator.clipboard.writeText(text).then(handleSuccess); } else { const textArea = document.createElement('textarea'); textArea.value = text; textArea.style.position = 'fixed'; textArea.style.left = '-9999px'; document.body.appendChild(textArea); textArea.focus(); textArea.select(); try { document.execCommand('copy'); handleSuccess(); } catch (err) { console.error('无法复制', err); } document.body.removeChild(textArea); } } </script> </div> </div> </div> <!-- 相关推荐模块 --> <div class="member-cta-section"> <div class="member-cta-container"> <div class="member-cta-layout"> <div class="member-cta-left"> <div class="member-cta-title">提示词宝典 · 终身会员</div> <p class="member-cta-desc">一次支付永久解锁,全站资源与持续更新;商业项目无限次使用</p> <div class="member-cta-stats" aria-label="会员数据概览"> <div class="member-cta-stat"> <div class="stat-number">420+</div> <div class="stat-label">品类</div> </div> <div class="member-cta-stat"> <div class="stat-number">8k+</div> <div class="stat-label">模板数量</div> </div> <div class="member-cta-stat"> <div class="stat-number">17k+</div> <div class="stat-label">会员数量</div> </div> </div> </div> <div class="member-cta-right"> <div class="member-cta-actions"> <a class="cta-btn-primary" href="/user/vip" target="_blank"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10z"/> <path d="M9 12l2 2 4-4"/> </svg> 成为会员 </a> </div> </div> </div> </div> </div> <script src="https://static.explinks.com/prompt/static/js/home/zone-section.js?v=1771167477664"></script> <div id="footer"> <div class="footer-container"> <div class="footer-content"> <div class="footer-section"> <h5 class="footer-section-title"> 热门提示词</h5> <ul class="footer-section-links"> <li> <a href="https://prompts.explinks.com/quick_keyword_generator" target="_blank">快速关键词生成助手</a> </li> <li> <a href="https://prompts.explinks.com/content_strategy_guide" target="_blank">内容营销策略制定</a> </li> <li> <a href="https://prompts.explinks.com/rapid_test_scenario" target="_blank">快速测试场景生成器</a> </li> <li> <a href="https://prompts.explinks.com/novel_writing_guide" target="_blank">小说创作策略指南</a> </li> <li> <a href="https://prompts.explinks.com/seo_keyword_generator" target="_blank">SEO优化关键词生成助手</a> </li> <li> <a href="https://prompts.explinks.com/article_title_generator" target="_blank">文章标题生成器</a> </li> </ul> </div> <div class="footer-section"> <h5 class="footer-section-title"> 热门角色</h5> <ul class="footer-section-links"> <li> <a href="https://prompts.explinks.com/category/content_creator" target="_blank">内容创作者</a> </li> <li> <a href="https://prompts.explinks.com/category/developer" target="_blank">开发者</a> </li> <li> <a href="https://prompts.explinks.com/category/product_manager" target="_blank">产品经理</a> </li> <li> <a href="https://prompts.explinks.com/category/business_consultant" target="_blank">商业顾问</a> </li> <li> <a href="https://prompts.explinks.com/category/marketing_personnel" target="_blank">市场营销</a> </li> <li> <a href="https://prompts.explinks.com/category/business_owner" target="_blank">企业管理者</a> </li> <li> <a href="https://prompts.explinks.com/category/seo_expert" target="_blank">SEO专家</a> </li> <li> <a href="https://prompts.explinks.com/category/data_analyst" target="_blank">数据分析师</a> </li> </ul> </div> <div class="footer-section"> <h5 class="footer-section-title"> 热门业务</h5> <ul class="footer-section-links"> <li> <a href="https://prompts.explinks.com/category/developer?biz_cat_slug=code" target="_blank">代码</a> </li> <li> <a href="https://prompts.explinks.com/category/content_creator?biz_cat_slug=content_creation" target="_blank">内容创作</a> </li> <li> <a href="https://prompts.explinks.com/category/human_resources_personnel?biz_cat_slug=human_resources" target="_blank">人力资源</a> </li> <li> <a href="https://prompts.explinks.com/category/data_analyst?biz_cat_slug=data_analysis" target="_blank">数据分析</a> </li> <li> <a href="https://prompts.explinks.com/category/writer?biz_cat_slug=creative_writing" target="_blank">创意写作</a> </li> <li> <a href="https://prompts.explinks.com/category/illustrator?biz_cat_slug=art" target="_blank">艺术插画</a> </li> </ul> </div> <div class="footer-section"> <h5 class="footer-section-title"> 大模型API</h5> <ul class="footer-section-links"> <li> <a href="https://www.explinks.com/api/ai_deepseek_brand" target="_blank">DeepSeek</a> </li> <li> <a href="https://www.explinks.com/api/ai_openai_brand" target="_blank">OpenAI</a> </li> <li> <a href="https://www.explinks.com/api/ai_anthropic_brand" target="_blank">Claude</a> </li> <li> <a href="https://www.explinks.com/api/ai_gemini_brand" target="_blank">Gemini</a> </li> <li> <a href="https://www.explinks.com/api/ai_grok_brand" target="_blank">Grok</a> </li> <li> <a href="https://www.explinks.com/api/ai_tongyi_brand" target="_blank">Qwen</a> </li> </ul> </div> <div class="footer-section"> <h5 class="footer-section-title"> 使用我们的提示词工具</h5> <ul class="footer-section-links"> <li> <a target="_blank">提示词API化工具(敬请期待)</a> </li> <li> <a href="https://tools.explinks.com/prompt-generator" target="_blank">提示词应用工具</a> </li> <li> <a href="https://console.explinks.com/myHome/prompts" target="_blank">我的提示词库</a> </li> <li> <a href="https://prompts.explinks.com/packs/partners" target="_blank">加入分销计划,零成本获得收益</a> </li> </ul> </div> </div> <div class="footer-bottom"> <div class="footer-brand"> <div class="footer-brand-logo"> <a href="https://www.explinks.com/" target="_blank"> <figure class="footer-logo-wrapper"> <img decoding="async" src="https://cdn.explinks.com/wp-content/uploads/2023/12/image-e1703756327221.png" alt="幂简集成ICON" class="footer-logo-img"/> </figure> </a> </div> </div> <div class="footer-bottom-left"> <div class="footer-copyright"> <p>Copyright © 2024 All Rights Reserved <a href="https://www.explinks.com/company/about" target="_blank">北京蜜堂有信科技有限公司</a></p> </div> <div class="footer-address"> <p>公司地址: 北京市朝阳区光华路和乔大厦C座1508</p> </div> </div> <div class="footer-bottom-right"> <div class="footer-license-info"> <div class="footer-license-item"> <p>增值电信业务经营许可证:京B2-20191889</p> </div> <div class="footer-license-icon"> <img decoding="async" src="https://cdn.explinks.com/wp-content/uploads/2023/12/police.png" alt="icon" class="footer-police-icon"/> </div> <div class="footer-license-item"> <p><a href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow">京ICP备18034931号-7</a></p> </div> </div> <div class="footer-feedback"> <p>意见反馈:010-53324933,mtyy@miitang.com</p> </div> </div> </div> </div> </div> <div class="sidebar-components-container"> <div class="sidebar"> <button class="sidebar-button" title="反馈问题" id="feedbackButton"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <circle cx="12" cy="12" r="10"/> <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"/> <line x1="12" y1="17" x2="12" y2="17"/> </svg> </button> <button class="sidebar-button up-button" title="返回顶部"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M12 19V5"/> <path d="M5 12l7-7 7 7"/> </svg> </button> </div> <div class="toast" id="comingSoonToast"> <div class="toast-content"> <span>敬请期待...</span> <button class="toast-close">×</button> </div> </div> <div class="modal" id="feedbackModal"> <div class="modal-content"> <div class="modal-header"> <h3 class="modal-title">反馈问题</h3> <button class="modal-close">×</button> </div> <form id="feedbackForm"> <div class="form-group"> <label class="form-label" for="description">描述 <span class="required">*</span></label> <textarea class="form-control" id="description" maxlength="200" required placeholder="请在此描述您要反馈的问题(200字以内)"></textarea> </div> <div class="form-group"> <label class="form-label">截图</label> <div class="image-upload" id="imageUpload"> <input type="file" id="imageInput" multiple accept="image/*" style="display: none;"> <p>点击或拖拽图片到此处上传(最多5张)</p> </div> <div class="image-preview" id="imagePreview"></div> </div> <div class="form-group"> <label class="form-label" for="contact">联系方式</label> <input type="text" class="form-control" id="contact" placeholder="QQ/邮箱/任选其一"> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" id="cancelButton">取消</button> <button type="submit" class="btn btn-primary">确定</button> </div> </form> </div> </div> <script> document.addEventListener('DOMContentLoaded', () => { const upButton = document.querySelector('.up-button'); const toast = document.getElementById('comingSoonToast'); const toastClose = document.querySelector('.toast-close'); const feedbackButton = document.getElementById('feedbackButton'); const feedbackModal = document.getElementById('feedbackModal'); const modalClose = feedbackModal.querySelector('.modal-close'); const cancelButton = document.getElementById('cancelButton'); const feedbackForm = document.getElementById('feedbackForm'); const imageUpload = document.getElementById('imageUpload'); const imageInput = document.getElementById('imageInput'); const imagePreview = document.getElementById('imagePreview'); let toastTimeout; // 返回顶部按钮逻辑 window.addEventListener('scroll', () => { if (window.scrollY > 300) { upButton.classList.add('show'); } else { upButton.classList.remove('show'); } }); upButton.addEventListener('click', () => { window.scrollTo({ top: 0, behavior: 'smooth' }); }); // 显示提示框函数 function showToast() { clearTimeout(toastTimeout); toast.classList.add('show'); toastTimeout = setTimeout(() => { toast.classList.remove('show'); }, 3000); } // 关闭提示框 toastClose.addEventListener('click', () => { toast.classList.remove('show'); clearTimeout(toastTimeout); }); // // 为三个按钮添加点击事件 // const comingSoonButtons = [ // document.querySelector('button[title="AI助理"]'), // document.querySelector('button[title="最近浏览"]'), // document.querySelector('button[title="对比列表"]') // ]; // // comingSoonButtons.forEach(button => { // button.addEventListener('click', showToast); // }); // 反馈模态框相关逻辑 function openModal() { feedbackModal.classList.add('show'); document.body.style.overflow = 'hidden'; } function closeModal() { feedbackModal.classList.remove('show'); document.body.style.overflow = ''; feedbackForm.reset(); imagePreview.innerHTML = ''; } feedbackButton.addEventListener('click', openModal); modalClose.addEventListener('click', closeModal); cancelButton.addEventListener('click', closeModal); // 点击模态框外部关闭 feedbackModal.addEventListener('click', (e) => { if (e.target === feedbackModal) { closeModal(); } }); // 图片上传相关逻辑 imageUpload.addEventListener('click', () => { imageInput.click(); }); imageInput.addEventListener('change', handleImageUpload); function handleImageUpload() { const files = Array.from(imageInput.files); const existingImages = imagePreview.querySelectorAll('.image-container'); const totalImages = existingImages.length + files.length; if (totalImages > 5) { alert('最多只能上传5张图片'); return; } files.forEach(file => { if (!file.type.startsWith('image/')) { return; } const reader = new FileReader(); reader.onload = (e) => { const container = document.createElement('div'); container.className = 'image-container'; const img = document.createElement('img'); img.src = e.target.result; container.appendChild(img); const deleteBtn = document.createElement('button'); deleteBtn.className = 'image-delete'; deleteBtn.innerHTML = '×'; deleteBtn.title = '删除图片'; deleteBtn.onclick = function () { if (confirm('确定要删除这张图片吗?')) { container.remove(); } }; container.appendChild(deleteBtn); imagePreview.appendChild(container); }; reader.readAsDataURL(file); }); } // 拖拽上传 imageUpload.addEventListener('dragover', (e) => { e.preventDefault(); imageUpload.style.borderColor = '#4a90e2'; }); imageUpload.addEventListener('dragleave', () => { imageUpload.style.borderColor = '#ddd'; }); imageUpload.addEventListener('drop', (e) => { e.preventDefault(); imageUpload.style.borderColor = '#ddd'; const files = Array.from(e.dataTransfer.files); if (files.length > 5) { alert('最多只能上传5张图片'); return; } imageInput.files = e.dataTransfer.files; handleImageUpload(); }); // 表单提交 feedbackForm.addEventListener('submit', async (e) => { e.preventDefault(); const description = document.getElementById('description').value.trim(); const contact = document.getElementById('contact').value.trim(); // if (!description || !contact) { if (!description) { alert('请填写反馈内容!'); return; } // 收集图片数据 const images = []; const imageElements = imagePreview.querySelectorAll('img'); imageElements.forEach(img => { images.push(img.src); }); // 准备要提交的数据 const formData = { description, contact, images }; try { const response = await fetch('https://api.explinks.com/feedback/submit', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(formData) }); if (response.ok) { alert('反馈提交成功!'); closeModal(); } else { throw new Error('提交失败'); } } catch (error) { alert('提交失败,请稍后重试!'); console.error('提交表单时出错:', error); } }); }); </script> </div> <script src="https://static.explinks.com/prompt/static/js/statistics/index.js?v=1771167477664"></script> <script src="https://static.explinks.com/hub/static/script/baidu-analytics.js?v=1771167477664"></script> <script charset="UTF-8" id="LA_COLLECT" src="//sdk.51.la/js-sdk-pro.min.js"></script> <script>LA.init({id: "3NS00J5GfuD7Tvg6", ck: "3NS00J5GfuD7Tvg6"})</script> <script> (function(){ var h = window.location.hostname; var d = ''; try { var p = h.split('.'); if (p.length >= 2) { d = '.' + p.slice(-2).join('.'); } } catch (e) {} var isIp = /^\d{1,3}(?:\.\d{1,3}){3}$/.test(h); var domainAttr = (!isIp && h !== 'localhost' && d) ? ('; domain=' + d) : ''; function getCookie(name){ var cs = document.cookie ? document.cookie.split('; ') : []; for (var i=0;i<cs.length;i++){ var parts = cs[i].split('='); var key = parts.shift(); var value = parts.join('='); if (key === name){ return decodeURIComponent(value || ''); } } return null; } function delCookie(name){ document.cookie = name + '=; path=/; Max-Age=0; SameSite=Lax' + domainAttr; } window.clearPromotionCookie = function(){ delCookie('promotion-code'); delCookie('promotion-code-set'); }; var setTs = getCookie('promotion-code-set'); var setNum = Number(setTs); if (getCookie('promotion-code') && setTs) { var ttl = 7200; document.cookie = 'promotion-code-set=' + encodeURIComponent(setTs) + '; path=/; Max-Age=' + ttl + '; SameSite=Lax' + domainAttr; } if (setTs && String(setNum) === setTs) { fetch('https://prompts-api.explinks.com/api/user/should-clear-promotion-code', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ setTimeMillis: setTs, referer: document.referrer || '' }) }) .then(function(r){ return r ? r.json() : null; }) .then(function(res){ if (res && (res.success === true || res.code === 200) && (res.data === true || res.data === 'true')) { window.clearPromotionCookie(); } }) .catch(function(){}); } var u = new URL(window.location.href); var v = (u.searchParams.get('ref') || u.searchParams.get('REF') || '').split('?')[0].trim(); if (v) { (function(){ var api = 'https://prompts-api.explinks.com/api/user/validate-promotion-code'; var payload = { promotionCode: v, referer: document.referrer || '' }; fetch(api, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }) .then(function(r){ return r ? r.json() : null; }) .then(function(res){ if (res && (res.success === true || res.code === 200) && (res.data === true || res.data === 'true')) { var ttl = 7200; var setTime = Date.now(); document.cookie = 'promotion-code=' + encodeURIComponent(v) + '; path=/; Max-Age=' + ttl + '; SameSite=Lax' + domainAttr; document.cookie = 'promotion-code-set=' + encodeURIComponent(String(setTime)) + '; path=/; Max-Age=' + ttl + '; SameSite=Lax' + domainAttr; } }) .catch(function(){}); })(); } })(); </script> <script src="https://static.explinks.com/prompt/static/js/statistics/view-count.js?v=1771167477664"></script> <script> // 页面加载完成后自动记录浏览量 ViewCountStatistics.autoRecordViewCount('regex_parsing_rules'); </script> <script src="https://static.explinks.com/prompt/static/js/prompt-detail-v4/countdown.js?v=1771167477664"></script> <!-- Highlight.js JavaScript --> <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script> <script> // 初始化代码高亮 document.addEventListener('DOMContentLoaded', function () { hljs.highlightAll(); }); </script> </body> </html>