Javascript检查周围的文字

时间:2013-08-21 10:26:19

标签: javascript regex lookaround

我正在编写一个BBCode样式编辑器 - 我有很好的理由这样做,而不是使用现成的努力。我有大部分工作正常但我需要测试一个条件。考虑以下标记

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

上面的管道字符不是一个错字,你马上就会看到 - 我用它作为占位符。

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

但是,请看以下情况

  1. 选择了abc - 转换产生[bold] abc [/ bold]
  2. 在abc的c之后插入 - 转换产生abc [粗体] [/ bold]
  3. 管道上的插入符号,|,最后一个字符[/ para]
  4. 目前我的代码很快责备并返回[pa | [bold] [/ bold] ra]。

    显然,我需要做的是确定用户的选择或当前插入位置不完全位于我的一个降价标记内(我已经有代码检查选择是否与降价标记重叠。< / p>

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

    或许解决方案 - 正如外观所暗示的那样 - 是在RegEx中。但是,我的正则表达式技巧非常基础,所以我非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您可以在光标位置使用caret plugin拆分文本文本,并使用两个正则表达式来测试光标是否在标记内:

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');
}

答案 1 :(得分:0)

如果您知道自己的标记有效,那么如果在下一个]之前有[,您可以查看某个位置是否在标记内。您可以简单地使用以下前瞻修改您的模式以排除这些情况:

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

或者如果你不喜欢逃避,这实际上可以正常工作:

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

但在这种情况下,可读性有点值得怀疑。