×
¥
查看详情
🔥 会员专享 文生代码 教育

正则表达式解析与教学

👁️ 575 次查看
📅 Dec 8, 2025
💡 核心价值: 本提示词旨在将复杂的正则表达式语法进行系统性拆解与教学。它通过逐步解析每个组件,清晰地解释其匹配规则与功能,帮助用户深入理解正则表达式的构造逻辑与文本匹配能力,适用于编程学习、文本处理规则制定及代码审查等场景。

🎯 可自定义参数(3个)

正则表达式模式
需要解析和讲解的正则表达式字符串
解析深度
正则表达式的解析详细程度
目标文本示例
用于辅助说明匹配结果的示例文本片段

🎨 效果示例

下面按“基础解析”的深度,对该正则进行逐段拆解,并说明它能匹配的字符串类型。正则与标志位如下: (?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> </div> <section class="usage-section"> <h2 class="section-title">📖 如何使用</h2> <div class="usage-tabs"> <button class="usage-tab active" onclick="switchUsageTab('chat')">Chat 用户</button> <button class="usage-tab" onclick="switchUsageTab('developer')">开发者</button> </div> <!-- Chat用户 --> <div class="usage-content active" id="chat-content"> <div class="usage-card"> <div class="usage-card-title"> <span>⚡</span> 30秒出活:复制 → 粘贴 → 搞定 </div> <div class="usage-card-desc"> 与其花几十分钟和AI聊天、试错,不如直接复制这些经过千人验证的模板,修改几个 {{变量}} 就能立刻获得专业级输出。省下来的时间,足够你轻松享受两杯咖啡! </div> <a href="javascript:void(0)" class="usage-card-action disabled" id="usageCopyBtn"> <span>加载中...</span> <span></span> </a> </div> <div class="usage-card"> <div class="usage-card-title"> <span>💬</span> 不会填参数?让 AI 反过来问你 </div> <div class="usage-card-desc"> 不确定变量该填什么?一键转为对话模式,AI 会像资深顾问一样逐步引导你,问几个问题就能自动生成完美匹配你需求的定制结果。零门槛,开口就行。 </div> <a href="https://tools.explinks.com/prompt-interactive?slug=regex_parsing_rules" class="usage-card-action"> <span>转为对话模式</span> <span>→</span> </a> </div> <div class="usage-card"> <div class="usage-card-title"> <span>🚀</span> 告别复制粘贴,Chat 里直接调用 </div> <div class="usage-card-desc"> 无需切换,输入 / 唤醒 8000+ 专家级提示词。 插件将全站提示词库深度集成于 Chat 输入框。基于当前对话语境,系统智能推荐最契合的 Prompt 并自动完成参数化,让海量资源触手可及,从此彻底告别"手动搬运"。 </div> <span class="usage-card-action" style="background:linear-gradient(135deg,#94a3b8,#64748b);box-shadow:0 4px 12px rgba(100,116,139,0.3);cursor:default;pointer-events:none;"> <span>即将推出</span> </span> </div> </div> <!-- 开发者 --> <div class="usage-content" id="developer-content"> <div class="usage-card"> <div class="usage-card-title"> <span>🔌</span> 接口一调,提示词自己会进化 </div> <div class="usage-card-desc"> 手动跑一次还行,跑一百次呢?通过 API 接口动态注入变量,接入批量评价引擎,让程序自动迭代出更高质量的提示词方案。Prompt 会自己进化,你只管收结果。 </div> <a href="https://tools.explinks.com/prompt-api?slug=regex_parsing_rules" class="usage-card-action"> <span>发布 API</span> <span>→</span> </a> </div> <div class="usage-card"> <div class="usage-card-title"> <span>🤖</span> 一键变成你的专属 Agent 应用 </div> <div class="usage-card-desc"> 不想每次都配参数?把这条提示词直接发布成独立 Agent,内嵌图片生成、参数优化等工具,分享链接就能用。给团队或客户一个"开箱即用"的完整方案。 </div> <a href="javascript:void(0)" class="usage-card-action disabled"> <span>创建 Agent</span> <span>→</span> </a> </div> </div> </section> <script> // 切换使用指南标签页 function switchUsageTab(tab) { document.querySelectorAll('.usage-tab').forEach(t => t.classList.remove('active')); document.querySelectorAll('.usage-content').forEach(c => c.classList.remove('active')); if (event) { event.target.classList.add('active'); } else { // 提供一个备用方式找到对应的tab let tabs = document.querySelectorAll('.usage-tab'); for(let i = 0; i < tabs.length; i++) { if(tabs[i].getAttribute('onclick').includes(tab)) { tabs[i].classList.add('active'); break; } } } const contentArea = document.getElementById(tab + '-content'); if (contentArea) { contentArea.classList.add('active'); } } // 优雅的 Toast 提示组件 function customToast(message, isError = false) { // 如果页面已经有相同提示,先移除 const existingToast = document.getElementById('custom-toast-message'); if (existingToast) { existingToast.remove(); } const toast = document.createElement('div'); toast.id = 'custom-toast-message'; toast.textContent = message; // 极简拟物化样式 Object.assign(toast.style, { position: 'fixed', top: '40px', left: '50%', transform: 'translateX(-50%) translateY(-20px)', background: isError ? '#fee2e2' : '#ffffff', color: isError ? '#ef4444' : '#10b981', padding: '12px 24px', borderRadius: '12px', boxShadow: '0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)', border: isError ? '1px solid #fecaca' : '1px solid #d1fae5', fontSize: '14px', fontWeight: '600', zIndex: '9999', opacity: '0', transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)', display: 'flex', alignItems: 'center', gap: '8px' }); // 成功状态添加一个小勾,失败添加一个叉 const icon = document.createElement('span'); icon.textContent = isError ? '❌' : '✓'; toast.prepend(icon); document.body.appendChild(toast); // 触发动画 requestAnimationFrame(() => { toast.style.opacity = '1'; toast.style.transform = 'translateX(-50%) translateY(0)'; }); // 3秒后自动消失然后解除 DOM setTimeout(() => { toast.style.opacity = '0'; toast.style.transform = 'translateX(-50%) translateY(-20px)'; setTimeout(() => toast.remove(), 300); }, 3000); } // 复制提示词功能(调用已经有的方法) function copyPromptContent() { const contentArea = document.getElementById('leftPromptContentArea'); if (contentArea && contentArea.textContent) { const textToCopy = contentArea.textContent; if (typeof copyTextToClipboard === 'function') { copyTextToClipboard(textToCopy, () => { if (typeof showToast === 'function') showToast('复制成功'); else customToast('提示词已复制到剪贴板'); }); } else if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(textToCopy).then(() => { customToast('提示词已复制到剪贴板'); }).catch(() => { fallbackCopyTextToClipboard(textToCopy); }); } else { fallbackCopyTextToClipboard(textToCopy); } } else { customToast('获取提示词内容失败,请先获取内容或联系管理员!', true); } } // 针对非安全环境(http)的旧版浏览器复制降级方案 function fallbackCopyTextToClipboard(text) { var textArea = document.createElement("textarea"); textArea.value = text; // 防止页面滚动和闪烁 textArea.style.top = "0"; textArea.style.left = "0"; textArea.style.position = "fixed"; textArea.style.opacity = "0"; document.body.appendChild(textArea); textArea.focus(); textArea.select(); try { var successful = document.execCommand('copy'); if (successful) { if (typeof showToast === 'function') showToast('复制成功'); else customToast('提示词已复制到剪贴板'); } else { customToast('复制失败,请手动选中并复制', true); } } catch (err) { customToast('复制失败,浏览器不支持', true); } document.body.removeChild(textArea); } // 动态更新"复制提示词"按钮状态 function updateUsageCopyBtnState() { const btn = document.getElementById('usageCopyBtn'); if (!btn) return; // 检查是否登录 var token = (function() { var m = document.cookie.match(/(?:^|; )Admin-Token=([^;]+)/); return m ? decodeURIComponent(m[1]) : null; })(); if (!token) { // 未登录 btn.classList.remove('disabled'); btn.innerHTML = '<span>登录后完整查看与复制</span><span>→</span>'; btn.onclick = function(e) { e.preventDefault(); if (typeof openLoginDialog === 'function') { openLoginDialog(); } else { window.location.href = '/login'; } }; return; } // 已登录,检查是否为会员 if (typeof window.fetchVipStatus === 'function') { window.fetchVipStatus().then(function(result) { btn.classList.remove('disabled'); if (result && result.isVip) { // VIP 会员 btn.innerHTML = '<span>复制提示词</span><span>→</span>'; btn.onclick = function(e) { e.preventDefault(); copyPromptContent(); }; } else { // 非终身会员 btn.innerHTML = '<span>终身会员免费复制</span><span>→</span>'; btn.onclick = function(e) { e.preventDefault(); window.open('/user/vip', '_blank'); }; } }).catch(function() { btn.innerHTML = '<span>状态异常,请刷新</span><span></span>'; }); } else { // 兜底:获取不到方法时,默认要求开通会员 btn.classList.remove('disabled'); btn.innerHTML = '<span>终身会员免费复制</span><span>→</span>'; btn.onclick = function(e) { e.preventDefault(); window.open('/user/vip', '_blank'); }; } } document.addEventListener('DOMContentLoaded', updateUsageCopyBtnState); // 监听登录成功消息重新渲染 window.addEventListener('message', function(event) { if (event.data === 'loginSuccess') { setTimeout(updateUsageCopyBtnState, 300); } }); </script> <div class="features-summary-section"> <h2 class="section-title">✅ 特性总结</h2> <div class="features-summary-list"> <div class="feature-summary-item"> <span class="feature-summary-bullet"></span> <span class="feature-summary-text">逐步解析正则表达式,帮助用户清晰了解每一个组件的功能与作用</span> </div> <div class="feature-summary-item"> <span class="feature-summary-bullet"></span> <span class="feature-summary-text">将复杂的正则语法简单化,轻松掌握匹配规则,高效完成任务</span> </div> <div class="feature-summary-item"> <span class="feature-summary-bullet"></span> <span class="feature-summary-text">为每一部分提供详细说明,快速理解不同结构的匹配逻辑</span> </div> <div class="feature-summary-item"> <span class="feature-summary-bullet"></span> <span class="feature-summary-text">精准展示文本匹配场景,为用户明确哪些字符串可以被匹配</span> </div> <div class="feature-summary-item"> <span class="feature-summary-bullet"></span> <span class="feature-summary-text">提升正则表达式学习效率,让初学者也能迅速上手应用</span> </div> <div class="feature-summary-item"> <span class="feature-summary-bullet"></span> <span class="feature-summary-text">支持多领域应用场景,从数据处理到文本校验均可轻松应对</span> </div> <div class="feature-summary-item"> <span class="feature-summary-bullet"></span> <span class="feature-summary-text">解决技术门槛问题,让非技术人员也能轻松生成并使用正则表达式</span> </div> <div class="feature-summary-item"> <span class="feature-summary-bullet"></span> <span class="feature-summary-text">直观呈现正则式的作用,助力用户优化代码及文本匹配效率</span> </div> </div> </div> <div class="problem-section"> <h2 class="section-title">🎯 解决的问题</h2> <div class="scenario-card"> <div class="scenario-text"> <div class="html-content-display solved-problems-text"> <p>帮助用户逐步解析复杂的正则表达式,并通过清晰的讲解降低其理解难度,从而使用户能够更有效地掌握正则表达式的使用场景及匹配规则。</p> </div> </div> </div> </div> <style> .problem-section { margin-bottom: 32px; } .problem-section .scenario-card { background-color: #f8f9fa; border-radius: 12px; padding: 24px; } .problem-section .scenario-text { color: #333; line-height: 1.6; } .problem-section .scenario-text .solved-problems-text { background-color: transparent !important; border: none !important; padding: 0 !important; margin: 0 !important; font-size: 15px; } </style> <!-- 版本历史 --> <div class="version-history-section"> <h2 class="section-title">🕒 版本历史</h2> <div class="coming-soon-wrapper"> <div class="coming-soon-content"> <div class="version-timeline"> <div class="version-item current"> <div class="version-badge">当前版本</div> <div class="version-header"> <span class="version-number">v2.1</span> <span class="version-date">2024-01-15</span> </div> <div class="version-title">优化输出结构,增强情节连贯性</div> <ul class="version-changes"> <li>✨ 新增章节节奏控制参数</li> <li>🔧 优化人物关系描述逻辑</li> <li>📝 改进主题深化引导语</li> <li>🎯 增强情节转折点设计</li> </ul> </div> <div class="version-item "> <div class="version-header"> <span class="version-number">v2.0</span> <span class="version-date">2023-12-20</span> </div> <div class="version-title">重构提示词架构,提升生成质量</div> <ul class="version-changes"> <li>🚀 全新的提示词结构设计</li> <li>📊 增加输出格式化选项</li> <li>💡 优化角色塑造引导</li> </ul> </div> <div class="version-item "> <div class="version-header"> <span class="version-number">v1.5</span> <span class="version-date">2023-11-10</span> </div> <div class="version-title">修复已知问题,提升稳定性</div> <ul class="version-changes"> <li>🐛 修复长文本处理bug</li> <li>⚡ 提升响应速度</li> </ul> </div> <div class="version-item "> <div class="version-header"> <span class="version-number">v1.0</span> <span class="version-date">2023-10-01</span> </div> <div class="version-title">首次发布</div> <ul class="version-changes"> <li>🎉 初始版本上线</li> </ul> </div> </div> </div> <div class="coming-soon-overlay"> <div class="coming-soon-badge">COMING SOON</div> <div class="coming-soon-text">版本历史追踪,即将启航</div> <div class="coming-soon-subtext">记录每一次提示词的进化与升级,敬请期待。</div> </div> </div> </div> <!-- 用户评价 --> <div class="reviews-section"> <div style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 24px;"> <h2 class="section-title" style="margin-bottom: 0;">💬 用户评价</h2> <!-- 暂时隐藏评价按钮,因为模块正在开发中 --> <!-- <button class="feedback-btn" onclick="openFeedbackModal()"> <span>✍️</span> <span>写评价 / 反馈</span> </button> --> </div> <div class="coming-soon-wrapper"> <div class="coming-soon-content"> <div class="reviews-stats"> <div class="rating-summary"> <div class="rating-score">4.8</div> <div class="rating-stars">⭐⭐⭐⭐⭐</div> <div class="rating-count">基于 28 条评价</div> </div> <div class="rating-bars"> <div class="rating-bar-item"> <span class="rating-label">5星</span> <div class="rating-bar"> <div class="rating-bar-fill" style="width: 85%"></div> </div> <span class="rating-percent">85%</span> </div> <div class="rating-bar-item"> <span class="rating-label">4星</span> <div class="rating-bar"> <div class="rating-bar-fill" style="width: 12%"></div> </div> <span class="rating-percent">12%</span> </div> <div class="rating-bar-item"> <span class="rating-label">3星</span> <div class="rating-bar"> <div class="rating-bar-fill" style="width: 3%"></div> </div> <span class="rating-percent">3%</span> </div> </div> </div> <div class="reviews-list"> <div class="review-item"> <div class="review-header"> <div class="review-avatar">👤</div> <div class="review-info"> <div class="review-author">电商运营 - 张先生</div> <div class="review-meta"> <span class="review-stars">⭐⭐⭐⭐⭐</span> <span class="review-date">2025-01-15</span> </div> </div> </div> <div class="review-content"> 双十一用这个提示词生成了20多张海报,效果非常好!点击率提升了35%,节省了大量设计时间。参数调整很灵活,能快速适配不同节日。 </div> <div class="review-tags"> <span class="review-tag">效果好</span> <span class="review-tag">节省时间</span> </div> </div> <div class="review-item"> <div class="review-header"> <div class="review-avatar">👤</div> <div class="review-info"> <div class="review-author">品牌设计师 - 李女士</div> <div class="review-meta"> <span class="review-stars">⭐⭐⭐⭐⭐</span> <span class="review-date">2025-01-10</span> </div> </div> </div> <div class="review-content"> 作为设计师,这个提示词帮我快速生成创意方向,大大提升了工作效率。生成的海报氛围感很强,稍作调整就能直接使用。 </div> <div class="review-tags"> <span class="review-tag">创意好</span> <span class="review-tag">专业</span> </div> </div> </div> <div class="reviews-footer"> <button class="load-more-reviews" onclick="alert('加载更多评论功能开发中...')"> 查看更多评价 </button> </div> </div> <div class="coming-soon-overlay"> <div class="coming-soon-badge">COMING SOON</div> <div class="coming-soon-text">用户评价与反馈系统,即将上线</div> <div class="coming-soon-subtext">倾听真实反馈,在这里留下您的使用心得,敬请期待。</div> </div> </div> </div> <!-- 反馈弹窗 --> <div class="feedback-modal" id="feedbackModal" onclick="closeFeedbackModal(event)"> <div class="feedback-modal-content" onclick="event.stopPropagation()"> <button class="feedback-close" onclick="closeFeedbackModal()">×</button> <div class="feedback-header"> <div class="feedback-icon">💬</div> <h2 class="feedback-title">提交反馈</h2> <p class="feedback-subtitle">您的反馈对我们非常重要</p> <div class="feedback-tip"> <span class="feedback-tip-icon">💡</span> <span class="feedback-tip-text">您的真实感受,是提示词通往完美的最后一块拼图。</span> </div> </div> <form class="feedback-form" onsubmit="handleFeedbackSubmit(event)"> <!-- 星级评分 --> <div class="feedback-rating-group"> <label class="feedback-label">整体评价 <span style="color: #ef4444;">*</span></label> <div class="feedback-rating-stars" id="ratingStars"> <span class="rating-star active" data-rating="1" onclick="setRating(1)">★</span> <span class="rating-star active" data-rating="2" onclick="setRating(2)">★</span> <span class="rating-star active" data-rating="3" onclick="setRating(3)">★</span> <span class="rating-star active" data-rating="4" onclick="setRating(4)">★</span> <span class="rating-star active" data-rating="5" onclick="setRating(5)">★</span> </div> <input type="hidden" name="rating" id="ratingValue" value="5" required> <div class="rating-text" id="ratingText">非常满意</div> </div> <div class="feedback-type-group"> <label class="feedback-label">反馈类型</label> <div class="feedback-type-options"> <label class="feedback-type-option"> <input type="radio" name="feedbackType" value="bug"> <span class="feedback-type-label">🪲 Bug反馈</span> </label> <label class="feedback-type-option"> <input type="radio" name="feedbackType" value="feature"> <span class="feedback-type-label">💡 功能建议</span> </label> <label class="feedback-type-option"> <input type="radio" name="feedbackType" value="content"> <span class="feedback-type-label">📝 内容问题</span> </label> <label class="feedback-type-option"> <input type="radio" name="feedbackType" value="review" checked> <span class="feedback-type-label">⭐ 使用评价</span> </label> </div> </div> <div class="feedback-input-group"> <label class="feedback-label">反馈内容 <span style="color: #ef4444;">*</span></label> <textarea class="feedback-textarea" id="feedbackContent" name="feedbackContent" placeholder="请详细描述您遇到的问题或建议..." maxlength="500" required oninput="updateFeedbackCharCount()" ></textarea> <div class="feedback-char-count"><span id="feedbackCharCount">0</span> / 500</div> </div> <button type="submit" class="feedback-submit-btn">提交反馈</button> </form> </div> </div> <script> // 打开反馈弹窗 function openFeedbackModal() { var modal = document.getElementById('feedbackModal'); if(modal) { modal.classList.add('show'); document.body.style.overflow = 'hidden'; } } // 设置星级评分 function setRating(rating) { var stars = document.querySelectorAll('.rating-star'); var ratingTexts = ['很不满意', '不满意', '一般', '满意', '非常满意']; // 更新星星显示 for(var i = 0; i < stars.length; i++) { if (i < rating) { stars[i].classList.add('active'); } else { stars[i].classList.remove('active'); } } // 更新隐藏字段和文字 var ratingValueInput = document.getElementById('ratingValue'); var ratingTextDiv = document.getElementById('ratingText'); if(ratingValueInput) ratingValueInput.value = rating; if(ratingTextDiv) ratingTextDiv.textContent = ratingTexts[rating - 1]; } // 关闭反馈弹窗 function closeFeedbackModal(event) { if (!event || event.target.id === 'feedbackModal' || event.target.classList.contains('feedback-close')) { var modal = document.getElementById('feedbackModal'); if(modal) { modal.classList.remove('show'); } document.body.style.overflow = ''; // 重置表单 var form = document.querySelector('.feedback-form'); if(form) form.reset(); var charCount = document.getElementById('feedbackCharCount'); if(charCount) charCount.textContent = '0'; // 重置星级为5星 setRating(5); } } // 更新字符计数 function updateFeedbackCharCount() { var contentElem = document.getElementById('feedbackContent'); var countElem = document.getElementById('feedbackCharCount'); if(contentElem && countElem) { countElem.textContent = contentElem.value.length; } } // 处理反馈提交 function handleFeedbackSubmit(event) { event.preventDefault(); var form = event.target; var formData = new FormData(form); var feedbackData = { type: formData.get('feedbackType'), rating: formData.get('rating'), content: formData.get('feedbackContent') }; console.log('Feedback submitted:', feedbackData); alert('感谢您的反馈!您的评价已经提交。'); closeFeedbackModal({target: {id: 'feedbackModal'}}); } </script> </div> <div class="prompt-detail-v5-right"> <div class="prompt-info-right right-panel"> <div id="action-panel"> <div class="action-card" style="text-align: center; color: #94a3b8; padding: 40px 20px;"> 加载中... </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { renderActionPanel(); }); // 监听登录成功消息重新渲染(强制刷新 Promise 缓存) window.addEventListener('message', function(event) { if (event.data === 'loginSuccess') { setTimeout(function() { window._vipStatusPromise = null; // 清除旧的 Promise 缓存 renderActionPanel(); }, 300); } }); function renderActionPanel() { var panel = document.getElementById('action-panel'); // 检查是否登录 var token = (function() { var m = document.cookie.match(/(?:^|; )Admin-Token=([^;]+)/); return m ? decodeURIComponent(m[1]) : null; })(); if (!token) { // 未登录 renderNonVipPanel(); return; } // 已登录,复用全局 fetchVipStatus(与 Header 共享同一请求,不会重复调用接口) if (typeof window.fetchVipStatus === 'function') { window.fetchVipStatus().then(function(result) { if (result && result.isVip) { renderVipPanel(); } else { renderNonVipPanel(); } }); } else { // 兜底:如果 header 还没加载完 renderNonVipPanel(); } } // 提示词定制化工具数据 var toolsBaseUrl = "https://tools.explinks.com"; var slug = "regex_parsing_rules"; var panelTools = [ { id: 'formatter', icon: '📝', name: '参数填写器', desc: '可视化填写变量参数', color: 'purple', href: slug ? (toolsBaseUrl + '/prompt-formatter?slug=' + slug) : 'javascript:void(0)' }, { id: 'interactive', icon: '💬', name: 'Web Chat 适配器', desc: '转为交互式对话脚本', color: 'green', href: slug ? (toolsBaseUrl + '/prompt-interactive?slug=' + slug) : 'javascript:void(0)' }, { id: 'translate', icon: '🌐', name: '本地化翻译器', desc: '一键翻译为多语言版本', color: 'blue', href: slug ? (toolsBaseUrl + '/prompt-translate?slug=' + slug) : 'javascript:void(0)' }, { id: 'optimizer', icon: '🎯', name: '个性化调校', desc: '根据场景微调提示词', color: 'orange', href: slug ? (toolsBaseUrl + '/prompt-optimizer?slug=' + slug) : 'javascript:void(0)' }, { id: 'api', icon: '⚡', name: 'API 动态调校', desc: '接口调用 + 批量评价优化', color: 'cyan', href: slug ? (toolsBaseUrl + '/prompt-api?slug=' + slug) : 'javascript:void(0)' }, // { id: 'agent', icon: '🤖', name: '生成个人工作助手', desc: '发布为独立 Agent 应用', color: 'pink', href: 'javascript:window.showToast("功能开发中")', badge: '即将推出' }, // { id: 'batch', icon: '📊', name: '批量数据生成器', desc: 'Form表单或Excel上传,批量生成结果', color: 'amber', href: 'javascript:window.showToast("功能开发中")', badge: '即将推出' } ]; function renderToolsHtml() { return panelTools.map(function(tool) { var badgeHtml = tool.badge ? '<span class="panel-tool-badge">' + tool.badge + '</span>' : ''; return '<a class="panel-tool-item" href="' + tool.href + '">' + '<div class="panel-tool-icon ' + tool.color + '">' + tool.icon + '</div>' + '<div class="panel-tool-info">' + '<div class="panel-tool-name">' + tool.name + '</div>' + '<div class="panel-tool-desc">' + tool.desc + '</div>' + '</div>' + '<span class="panel-tool-arrow">›</span>' + badgeHtml + '</a>'; }).join(''); } function renderVipPanel() { var panel = document.getElementById('action-panel'); panel.innerHTML = '' + '<!-- 核心:复制提示词 -->' + '<button class="copy-core-btn" id="rightCopyBtn" onclick="handleRightCopyClick()">' + '<span class="copy-icon">📋</span>' + '<span>复制提示词</span>' + '</button>' + '<div class="copy-sub-info">' + '<span class="free-badge">会员</span>' + '<span>无限次复制 · 已解锁全部工具</span>' + '</div>' + '<!-- 会员状态 -->' + '<div class="panel-member-active">' + '<span class="panel-member-active-icon">✨</span>' + '<div class="panel-member-active-info">' + '<div class="panel-member-active-title">终身会员</div>' + '<div class="panel-member-active-desc">已解锁全部功能</div>' + '</div>' + '</div>' + '<!-- 工具箱 -->' + '<div class="panel-tools-section">' + '<div class="panel-tools-title">🛠 提示词定制化工具</div>' + '<div class="panel-tools-subtitle">7 种 AI 工具,把同一条提示词变成你的专属版本</div>' + '<div class="panel-tools-grid">' + renderToolsHtml() + '</div>' + '</div>'; } function renderNonVipPanel() { var panel = document.getElementById('action-panel'); var currentPrice = 188; // 检查是否登录以决定点击按钮行为 var token = (function() { var m = document.cookie.match(/(?:^|; )Admin-Token=([^;]+)/); return m ? decodeURIComponent(m[1]) : null; })(); var copyBtnAction = token ? "window.open('/user/vip', '_blank')" : "handleUnloggedCopyClick()"; var copyBtnText = token ? "终身会员免费复制" : "登录后完整查看与复制"; panel.innerHTML = '' + '<!-- 核心:复制提示词 -->' + '<button class="copy-core-btn" id="rightCopyBtn" onclick="' + copyBtnAction + '">' + '<span>' + copyBtnText + '</span>' + '</button>' + '<!-- 会员提示 -->' + '<div class="panel-member-hint">' + '<p class="panel-member-hint-text">' + '开通会员解锁 <strong>无限复制</strong> + 全部工具<br>' + '<span style="font-size:12px; color:#64748b;">¥' + currentPrice + ' 终身 · 7天无理由退款</span>' + '</p>' + '<a href="/user/vip" target="_blank" class="panel-member-link">' + '了解会员权益 <span>→</span>' + '</a>' + '</div>' + '<!-- 工具箱 -->' + '<div class="panel-tools-section">' + '<div class="panel-tools-title">🛠 提示词定制化工具</div>' + '<div class="panel-tools-subtitle">7 种 AI 工具,把同一条提示词变成你的专属版本</div>' + '<div class="panel-tools-grid">' + renderToolsHtml() + '</div>' + '</div>'; } function handleUnloggedCopyClick() { if (typeof openLoginDialog === 'function') { openLoginDialog(function() { if (typeof loadLeftPromptContent === 'function') { loadLeftPromptContent(); } if (typeof loadPromptContent === 'function') { loadPromptContent(); } }); } else { window.location.href = '/user/login'; } } function handleRightCopyClick() { const contentArea = document.getElementById('leftPromptContentArea'); if (!contentArea || !contentArea.textContent.trim()) { if (typeof window.showToast === 'function') { window.showToast('提示词内容未加载完全,或无权限复制'); } else { alert('提示词内容未加载完全,或无权限复制'); } return; } const content = contentArea.textContent; const btn = document.getElementById('rightCopyBtn'); const onSuccess = () => { if (btn) { btn.classList.add('copied'); btn.innerHTML = '<span class="copy-icon">✅</span><span>已复制到剪贴板</span>'; setTimeout(() => { btn.classList.remove('copied'); btn.innerHTML = '<span class="copy-icon">📋</span><span>复制提示词</span>'; }, 2000); } }; const showSuccessMsg = () => { if (typeof window.showToast === 'function') window.showToast('提示词已复制到剪贴板'); onSuccess(); }; const showFailMsg = () => { if (typeof window.showToast === 'function') window.showToast('复制失败,请手动选中并复制', true); else alert('复制失败,请手动选中并复制'); }; if (typeof copyTextToClipboard === 'function') { copyTextToClipboard(content, () => { showSuccessMsg(); }); } else if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(content).then(() => { showSuccessMsg(); }).catch(() => { if (typeof fallbackCopyTextToClipboard === 'function') { fallbackCopyTextToClipboard(content); showSuccessMsg(); } else { showFailMsg(); } }); } else if (typeof fallbackCopyTextToClipboard === 'function') { fallbackCopyTextToClipboard(content); showSuccessMsg(); } else { // 最底层的兜底容错,专治各种不服环境(包括本地IP非HTTPS等环境导致的 navigator.clipboard 失效) try { var textArea = document.createElement("textarea"); textArea.value = content; // 防止页面滚动 textArea.style.top = "0"; textArea.style.left = "0"; textArea.style.position = "fixed"; document.body.appendChild(textArea); textArea.focus(); textArea.select(); var successful = document.execCommand('copy'); document.body.removeChild(textArea); if (successful) { showSuccessMsg(); } else { showFailMsg(); } } catch (err) { showFailMsg(); } } } </script> </div> </div> </div> <!-- 相关推荐模块 --> <script src="https://static.explinks.com/prompt/static/js/home/zone-section.js?v=1774518585999"></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 { // 从 cookie 中获取用户 Token const tokenMatch = document.cookie.match(/(?:^|; )Admin-Token=([^;]+)/); const token = tokenMatch ? decodeURIComponent(tokenMatch[1]) : ''; const headers = { 'Content-Type': 'application/json' }; if (token) { headers['Authorization'] = 'Bearer ' + token; } const response = await fetch('https://api.explinks.com/feedback/submit', { method: 'POST', headers: headers, 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=1774518585999"></script> <script src="https://static.explinks.com/hub/static/script/baidu-analytics.js?v=1774518585999"></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=1774518585999"></script> <script> // 页面加载完成后自动记录浏览量 ViewCountStatistics.autoRecordViewCount('regex_parsing_rules'); </script> <script src="https://static.explinks.com/prompt/static/js/prompt-detail-v5/countdown.js?v=1774518585999"></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>