1

我正在编写一个 BBCode 风格的编辑器——我有充分的理由这样做,而不是使用现成的工作。我已经让它大部分工作正常,但我需要测试一种情况。考虑以下标记

[para=2]
abc
[/para]
[para=0]
123
[/pa|ra]

上面的管道字符不是您稍后会看到的错字 - 我将其用作占位符。

现在想象下一个用户操作是插入 - 我的版本 - 粗体降价标签 [bold][/bold]。无论用户是否已经选择了一些现有文本(例如 abc),我的代码都可以处理此操作。

但是,请看以下情况

  1. abc selected - 转换产生 [bold]abc[/bold]
  2. abc 的 c 之后的插入符号 - 转换产生 abc[bold][/bold]
  3. 管道上的插入符号,|,最后一个字符 [/para]

目前,我的代码很乐意执行并返回 [pa|[bold][/bold]ra]。

显然,我需要做的是确定用户的选择或当前插入符号位置不完全位于我的降价标签之一内(我已经有代码检查选择不与降价标签重叠。

我需要按照“环顾四周”选择开始和结束位置的方式做一些事情,以检测该位置是否在降价标签内。

也许解决方案——正如“环视”这个词所暗示的——是在正则表达式中。但是,我的正则表达式技能非常基础,所以我非常感谢任何帮助。

4

2 回答 2

1

您可以在光标位置使用插入符号插件拆分文本文本,并使用两个正则表达式来测试光标是否在标签内:

var editor = $('.editor');
var pos = editor.caret();
var text = editor.val()
var before = text.substring(0, pos);
var after = text.substring(pos, text.length);
if (before.match(/\[[^\[]*$/) && after.match(/^[^\[]*\]/)) {
    alert('inside');
}
于 2013-08-21T10:46:50.343 回答
0

如果你知道你的标记是有效的,那么你可以找出一个位置是否在一个标签内,如果]在 next 之前有一个[。您可能可以简单地使用以下前瞻性修改您的模式以排除这些情况:

(?![^\[]*\])...

或者,如果您不喜欢转义,这实际上可以正常工作:

(?![^[]*])...

但在这种情况下,可读性有些问题。

于 2013-08-21T15:06:15.350 回答