正则表达式 - 格式化块中的文本 - IM

2024-04-01

您好,我正在尝试找出一个正则表达式来替换innerHTML块中的文本,以便为类似于Google IM的操作的文本提供本地格式。

Where: 
_Italics_
!Inderline!
*Bold*
-Strike-

部分条件是文本必须由符号包裹,但如果紧随其后的是空格,则触发条件无效;所以 * 粗体 * 不会加粗并且: * 不加粗但这是大胆的

innerHTML 将具有已转换为 href 的 URL,因此为了不弄乱它们,我已将以下内容添加到正则表达式的前面。

    (?!(?!.*?<a)[^<]*<\/a>)

以下 javascript 不会捕获所有结果,并且会根据我执行替换的顺序而产生不同的结果。

var boldPattern          = /(?!(?!.*?<a)[^<]*<\/a>)\*([^\s]+[\s\S]?[^\s]+)\*([\s_!-]?)/gi;
var italicsPattern       = /(?!(?!.*?<a)[^<]*<\/a>)_([^\s]+[\s\S]?[^\s]+)_([\s-!\*]?)/gi;
var strikethroughPattern = /(?!(?!.*?<a)[^<]*<\/a>)-([^\s]+[\s\S]?[^\s]+)-([\s_!\*]?)/gi;
var underlinePattern     = /(?!(?!.*?<a)[^<]*<\/a>)!([^\s]+[\s\S]?[^\s]+)!([\s-_\*]?)/gi;
str = str.replace(strikethroughPattern, '<span style="text-decoration:line-through;">$1</span>$2');
str = str.replace(boldPattern, '<span style="font-weight:bold;">$1</span>$2');
str = str.replace(underlinePattern, '<span style="text-decoration:underline;">$1</span>$2');
str = str.replace(italicsPattern, '<span style="font-style:italic;">$1</span>$2');

3选4的测试数据如下:

1 _-*ISB*-_ 2 _-!ISU!-_ 3 _*-IBS-*_ 4 _*!IBU!*_
5 _!-IUS-!_ 6 _!*IUB*!_ 7 -_*SIB*_- 8 -_!SIU!_-
9 -*_SBI_*- 10 -*!SBU!*- 11 -!_SUI_!- 12 -!*SIB*!-
13 *_-BIS-_* 14 *_!BIU!_* 15 *-_BSI_-* 16 *-!BSU!-*
17 *!_BUI_!* 18 *!-BUS-!* 19 !_-UIS-_! 20 !_*UIB*_!
21 !-_USI_-! 22 !-*USB*-! 23 !*_UBI_*! 24 !*-UBS-*!

您甚至可以拥有 4 级深度嵌套样式跨度,就像 24 种排列中的任何一种一样,其中选择所有 4 种模式,如下所示:

    -!_*SUIB*_!-

谢谢,我已经为此奋斗了大约一周。

避免来自 Mozilla 的“标记不应传递给innerHTML动态地。”(我不明白当人们改变格式时这是如何可能的)。

感谢一百万正则表达式向导!我欠你的情。

mwolfe.

Update

使用与上面相同的 href 检测和 @talemyn 帮助,我们现在处于:

var boldPattern          = /(?!(?!.*?<a)[^<]*<\/a>)\*([^\s][^\*]*)\*/gi;
var italicsPattern       = /(?!(?!.*?<a)[^<]*<\/a>)_([^\s][^_]*)_/gi;
var strikethroughPattern = /(?!(?!.*?<a)[^<]*<\/a>)-([^\s][^-]*)-/gi;
var underlinePattern     = /(?!(?!.*?<a)[^<]*<\/a>)!([^\s][^!]*)!/gi;
str = str.replace(strikethroughPattern, '<s>$1</s>');
str = str.replace(italicsPattern, '<span style="font-style:italic;">$1</span>');
str = str.replace(boldPattern, '<strong>$1</strong>');
str = str.replace(underlinePattern, '<u>$1</u>');

这似乎涵盖了一个极端的例子:

    _wow *a real* !nice *person! on -stackoverflow* figured- it out_ cool beans.

我认为可以使用样式跨度并执行正则表达式回溯来确定之前未关闭的跨度,关闭它,使用旧格式加新属性打开一个新跨度,在应该时关闭并打开一个新跨度以完成格式化..但是正如 @NovaDenizen 指出的那样,正则表达式可能会变得混乱或不可能。

谢谢你的帮助。如果有任何改进请告诉我。注意:我无法使用,因为网站上的 CSS 无法呈现它。这样可以超载吗? [这是针对 firefox/greasemonkey/chrome 插件的]

更新(几乎)最终版

使用我的“损坏”测试短语,正如 @MikeM 正确指出的那样,作为示例,无论嵌套是否正确,它都会在 Google IM 中正确呈现(减去下划线)。因此,查看 Google IM 中文本的 HTML 输出,我注意到它很高兴没有预先格式化该字符串,而是简单地根据需要进行了替换。

因此,在查看使用 ResetCSS 删除的站点代码后,我需要通过 JavaScript 插入 CSS 格式。 Stackoverflow 来救援。https://stackoverflow.com/questions/707565/how-do-you-add-css-with-javascript and https://stackoverflow.com/questions/20107/yui-reset-css-makes-strongemthis-not-work-em-strong

所以我的解决方案现在看起来像:

....
var css = document.createElement("style");
css.type = "text/css";
css.innerHTML = "strong, b, strong *, b * { font-weight: bold !important; } \
            em, i, em *, i * { font-style: italic !important; }";
document.body.appendChild(css);
 ....
var boldPattern          = /(?!(?!.*?<a)[^<]*<\/a>)\*([^\s][^\*]*)\*/gi;
var italicsPattern       = /(?!(?!.*?<a)[^<]*<\/a>)_([^\s][^_]*)_/gi;
var strikethroughPattern = /(?!(?!.*?<a)[^<]*<\/a>)-([^\s][^-]*)-/gi;
var underlinePattern     = /(?!(?!.*?<a)[^<]*<\/a>)!([^\s][^!]*)!/gi;
str = str.replace(strikethroughPattern, '<s>$1</s>');
str = str.replace(italicsPattern, '<i>$1</i>');
str = str.replace(boldPattern, '<b>$1</b>');
str = str.replace(underlinePattern, '<u>$1</u>');
.....

And tada它大部分有效!

更新最终解决方案在对 @MikeM 的锚元素检查进行最后一刻的简化并结合另一个的条件之后堆栈溢出 https://stackoverflow.com/questions/15288276/regex-query-help-lookbehind发布后我们已经达成了一个完整的工作解决方案。

我还需要添加对带有结束符号的单字符样式的检查,因为我们要并排替换触发标记。

正如 @acheong87 提醒的那样,要小心 \w,因为它包括_,因此它被添加到除删除线模式之外的所有模式的换行条件中。

var boldPattern          = /(?![^<]*<\/a>)(^|<.>|[\s\W_])\*(\S.*?\S)\*($|<\/.>|[\s\W_])/g;
var italicsPattern       = /(?![^<]*<\/a>)(^|<.>|[\s\W])_(\S.*?\S)_($|<\/.>|[\s\W])/g;
var strikethroughPattern = /(?![^<]*<\/a>)(^|<.>|[\s\W_])-(\S.*?\S)-($|<\/.>|[\s\W_])/gi;
var underlinePattern     = /(?![^<]*<\/a>)(^|<.>|[\s\W_])!(\S.*?\S)!($|<\/.>|[\s\W_])/gi;
str = str.replace(strikethroughPattern, '$1<s>$2</s>$3');
str = str.replace(italicsPattern, '$1<i>$2</i>$3');
str = str.replace(boldPattern, '$1<b>$2</b>$3');
str = str.replace(underlinePattern, '$1<u>$2</u>$3');

非常感谢大家(@MikeM、@talemyn、@acheong87 等)

mwolfe.


试试这些:

var boldPattern          = /\*([^\s][^\*]*)\*/gi;
var italicsPattern       = /_([^\s][^_]*)_/gi;
var strikethroughPattern = /-([^\s][^-]*)-/gi;
var underlinePattern     = /!([^\s][^!]*)!/gi;

虽然,在replace,不要使用$2因为这些正则表达式模式中没有第二个匹配项。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正则表达式 - 格式化块中的文本 - IM 的相关文章

随机推荐

  • Numpy 用全零填充 4D 单位

    我有一个 4D numpy 数组 但每个元素都是可变大小的 3D 体积 本质上它是一个 3D 体积的 numpy 列表 所以 numpy 数组的形状是 Pdb batch x shape 3 并取元素i在那个列表中 它看起来像这样 Pdb
  • 错误 main.lua:23:尝试索引 upvalue 'Menu' (布尔值)

    我正在尝试用 lua 和 love2d 制作一个主菜单 这是我第一次这样做 遗憾的是没有关于此事的教程 所以我自己尝试了一下 我一直遇到这个错误 我不知道如何解决它 请帮助 完整错误消息 错误main lua 23 尝试索引upvalue
  • 如何使用递归查询向后遍历分层树结构

    我使用 PostgreSQL 9 1 来查询分层树结构数据 其中包含与节点连接的边 或元素 这些数据实际上是针对流网络的 但我已将问题抽象为简单的数据类型 考虑这个例子tree桌子 每条边都有长度和面积属性 用于确定网络中的一些有用的度量
  • 哪个 Java 库可用于通过 WebDAV 访问数据?

    这就是问题 哪个库可以帮助我在 Java 程序中访问通过 WebDAV 提供的数据 首选开源 我创建了一个非常易于使用的 java webdav 客户端 http sardine googlecode com http sardine go
  • “将脚本放在底部”正确吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 提高网站性能的最佳实践http developer yahoo com performance rules html http developer y
  • 如何在创建后更改 InsetDrawable 插入值

    我有一个InsetDrawable已定义 我只是希望能够在运行时调整插图的值 而无需重新分配另一个可绘制对象 这可能吗 或者唯一的方法是重新创建 InsetDrawable 这是不可能的 因为其 API 不是公开的 我遇到了和你一样的问题
  • JS Fetch API 不适用于具有授权属性的 ASP.NET Core 2 控制器

    我在客户端有以下代码 fetch music index headers Content Type application json then response gt if response ok throw response return
  • HTMLPurifier 破坏图像

    我试图根据 WYSIWYG CK 编辑器 的用户输入运行 HTMLPurifier 但图像损坏 未过滤的输入 img alt laugh src lib ckeditor plugins smiley images teeth smile
  • Sqlalchemy:当字符串位于左侧且列位于右侧时,使用 PSQL 的“~”运算符

    我知道 WHERE column regexp 这是 sqlalchemy 吗 where column op regexp 但我怎样才能创造这个呢 WHERE string column 正则表达式存储在数据库中 您需要创建一个liter
  • PhpSerial:没有可用的 stty——似乎无法让它工作

    我正在开发一个项目 涉及使用 Raspberry Pi 上的 UART 引脚读取和写入串行板 然而 我已经碰壁了 任何时候我尝试使用PhpSerial我总是收到错误 致命错误 没有可用的 stty 无法运行 在 var www PHP Se
  • 使用 PDO 准备好的语句插入多行

    我想知道是否可以使用一个准备好的语句插入多行 下面是我通常如何将一行插入数据库的示例 params array params val1 val1 params val2 val2 params val3 val3 sql INSERT IN
  • 在 RDS 上,我可以在只读副本中创建主服务器上不存在的表吗?

    我们有一个单独的 RDS 实例来处理会话状态表 但是发现会话数据库负载非常低 如果我们可以将实例处理会话转换为主数据库的只读副本 那么我们就可以将其用于只读任务 即使副本存在较大滞后 这些任务也是安全的 有没有人在 RDS 上做过类似的事情
  • 在 angular.js 中以实际大小显示图像

    我需要以实际大小显示图像 即使它比其容器大 我尝试了使用 Image 变量的技巧和捕获负载大小 https stackoverflow com a 7686392 196451像这样的东西 HTML div div
  • iPad、iOS8 和 Objective-C 中的 UIAlertController 不显示“取消”按钮

    我正在尝试使用 UIAlertController 我需要一个带有两个按钮的弹出窗口 取消 和 删除并注销 但我只能看到 删除并退出 按钮 看不到取消按钮 这是代码 NSString confirmText Hi UIAlertContro
  • 使用相机拍照并保存到图库

    我已经浏览了几个文档和堆栈 但是我不太确定如何实现这个 帮助或示例代码确实可以帮助我了解更多 这是运行相机的代码集 它工作得很好 我的下一个问题是 如何让它自动保存到手机图库中 Override protected void onCreat
  • CodeIgniter Active Record 从一个表插入到另一个表

    使用 codeigniter 活动记录语法将数据从一个表插入到另一个表的语法是什么 我尝试了通常的 mysqli 查询并且它有效 但我想使用 CodeIgniter Active Record 语法来保持一致性 我尝试使用这些 CodeIg
  • python 二维数组到字典

    我想从表示为二维数组的对称矩阵的下三角创建一个字典 例如 如果 numpy 数组是 array 0 2 3 2 0 4 3 4 0 然后我希望字典看起来像 1 0 2 2 0 3 2 1 4 矢量也有类似的帖子 将 Numpy 数组转换为稀
  • 在javascript中检测字符串的unicode语言

    我有一个包含几个单词的字符串 我想找出所有只包含泰米尔语 Unicode 字符的单词 我是 JavaScript 新手 使用 Go 我做同样的事情 tokens strings Fields stringContent delim spli
  • 是否可以从 Stripe API 获取某个计划的订阅者数量?

    我正在使用 Stripe net 库来调用 Stripe API 我想获得各种计划的订户总数 但我不确定当前的 API 和 或 Stripe NET 库是否可以实现这一点 任何人都可以提供任何关于这是否可能的见解吗 我发现这有效 抱歉 这是
  • 正则表达式 - 格式化块中的文本 - IM

    您好 我正在尝试找出一个正则表达式来替换innerHTML块中的文本 以便为类似于Google IM的操作的文本提供本地格式 Where Italics Inderline Bold Strike 部分条件是文本必须由符号包裹 但如果紧随其