1

私は BBCode スタイルのエディターを作成中です。既成の努力を使用するのではなく、これを行うには優れた理由があります。ほとんどが正常に動作していますが、1 つの条件についてテストする必要があります。次のマークアップを検討してください

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

すぐにわかるように、上のパイプ文字はタイプミスではありません。プレースホルダーとして使用しています。

ここで、次のユーザー アクションが、私のバージョンのボールド マークダウン タグ [bold][/bold] を挿入することだと想像してください。私のコードは、ユーザーが既存のテキストの一部を既に選択しているかどうかに関係なく、これを処理できます。たとえば、abc.

ただし、次の状況を見てください。

  1. abc を選択 - 変換により [bold]abc[/bold] が生成されます
  2. abc の c の後のキャレット - 変換により abc[bold][/bold] が生成されます
  3. 最後の [/para] のパイプ、|、文字のキャレット

現在、私のコードは [pa|[bold][/bold]ra] を喜んで義務付けて返します。

明らかに、私がする必要があるのは、ユーザーの選択、または現在のキャレット位置がマークダウン タグの 1 つに完全に収まらないことを確認することです (選択がマークダウン タグと重なっていないことを確認するコードが既にあります。

場所がマークダウンタグ内にあることを検出するには、選択の開始位置と終了位置を「見回す」という行に沿って何かをする必要があります。

おそらく、ルックアラウンドという言葉が示唆するように、解決策は正規表現にあります。ただし、私の正規表現スキルはかなり基本的なものなので、助けていただければ幸いです。

4

2 に答える 2

0

マークアップが有効であることがわかっている場合は、位置がタグ内にあるかどうか]、次の[. これらのケースを除外するために、次の先読みでパターンを単純に修正できます。

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

または、エスケープが嫌いな場合、これは実際には問題なく機能します。

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

しかし、この場合、可読性にはやや疑問があります。

于 2013-08-21T15:06:15.350 に答える