【问题标题】:Javascript check surrounding textJavascript 检查周围的文本
【发布时间】:2013-08-21 10:26:19
【问题描述】:

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

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

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

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

不过,看看以下几种情况

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

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

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

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

也许解决方案 - 正如“环视”一词所暗示的那样 - 在 RegEx 中。但是,我的正则表达式技能非常基础,因此我非常感谢任何帮助。

【问题讨论】:

  • 到那时,您是否检查过您的标记是否有效?在这种情况下,在下一个[ 之前检查是否有] 就足够了。
  • 我最终按照你的建议做了
  • 那我会回答的。

标签: javascript regex lookaround


【解决方案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');
}

【讨论】:

  • 谢谢。插入符号插件实际上不是必需的。 textarea.textRange 对象提供所需的所有信息。也许它不是跨浏览器,但谁在乎 - 我只需要它在 Chrome 中工作。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 对不起 - 不知道为什么我从来没有时间接受这个答案。
猜你喜欢
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多