2

次の問題に対する (regexp?) ベースのパーサー ルールを見つけようとして、頭を壁にぶつけています。テキスタイルに似たテキスト マークアップ パーサーを (PHP を使用して) 開発していますが、インライン フォーマット ルールを正しく取得する方法がわかりません。また、見つけたテキスタイル パーサーでは次のテキストをフォーマットできないことに気付きました。フォーマットしたいので:

-*deleted* -- text- and -more deleted text-

私が望む結果は次のとおりです。

<del><strong>deleted</strong> -- text</del> and <del>more deleted text</del>

私が望まないのは:

<del><strong>deleted</strong> </del>- text- and <del>more deleted text</del>

どんなアイデアでも大歓迎です!どうもありがとう!

アップデート

「-」は引き続き有効な文字(ハイフン)である必要があることを言及する必要があったと思います:)-たとえば、次のことが可能である必要があります。

-american-football player-

期待される結果:

<del>american-football player</del>
4

5 に答える 5

2

RedClothライブラリのパーサーの説明に基づいており、ダブル ダッシュの変更が加えられています。

@
  (?<!\S)               # Start of string, or after space or newline
  -                     # Opening dash
  (                     # Capture group 1
    (?:                 #   : (see note 1)
      [^-\s]+           #   :
      [-\s]+            #   :
    )*?                 #   :
    [^-\s]+?            #   :
  )                     # End
  -                     # Closing dash
  (?![^\s!"\#$%&',\-./:;=?\\^`|~[\]()<])  # (see note 2)
@x
  • 注 1:これは、単一でないダッシュと空白で囲まれた単一のダッシュを消費しながら、次のダッシュまで遅延して一致する必要があります。
  • 注 2:スペース、句読点、改行、または文字列の終わりが続きます。

または圧縮:

@(?<!\S)-((?:[^-\s]+[-\s]+)*?[^-\s]+?)-(?![^\s!"#$%&',\-./:;=?\\^`|~[\]()<])@

いくつかの例:

$regex = '@(?<!\S)-((?:[^-\s]+[-\s]+)*?[^-\s]+?)-(?![^\s!"#$%&\',\-./:;=?\\\^`|~[\]()<])@';
$replacement = '<del>\1</del>';

preg_replace($regex, $replacement, '-*deleted* -- text- and -more deleted text-'), "\n";
preg_replace($regex, $replacement, '-*deleted*--text- and -more deleted text-'), "\n";
preg_replace($regex, $replacement, '-american-football player-'), "\n";

出力します:

<del>*deleted* -- text</del> and <del>more deleted text</del>
<del>*deleted*</del>-text- and <del>more deleted text</del>
<del>american-football player</del>

-*deleted*-2 番目の例では、.の前にスペースがないため、 .だけに一致し--ます。イニシャルの前にスペースがない-text-ため、一致しません。-

于 2010-07-14T16:44:59.253 に答える
1

タグはstrong簡単です:

$string = preg_replace('~[*](.+?)[*]~', '<strong>$1</strong>',  $string);

他の人に取り組んでいます。


delタグの恥知らずなハック:

$string = preg_replace('~-(.+?)-~', '<del>$1</del>', $string);
$string = str_replace('<del></del>', '--', $string);
于 2010-07-14T07:53:52.367 に答える
1

単一のトークンの場合、単純に一致させることができます:

-((?:[^-]|--)*)-

次のように置き換えます。

<del>$1</del>

\*((?:[^*]|\*{2,})*)\*とについても同様です<strong>$1</strong>

正規表現は非常に単純-で、両端がリテラルです。中間のキャプチャ グループでは、ハイフンまたは 2 つのハイフンが連続していないものをすべて許可します。

のように、単語内の単一のダッシュも許可するにはobjective-c、2 つの英数字で囲まれたダッシュを受け入れることで機能します。

-((?:[^-]|--|\b-\b)*)-
于 2010-07-14T07:28:55.737 に答える
0

最初にこの警告サインを読むべきだと思います [X]HTML を正規表現で解析することはできません

おそらく、php html ライブラリをグーグルで検索してみてください。

于 2010-07-14T07:51:33.930 に答える
0

次のようなものを試すことができます:

'/-.*?[^-]-\b/'

末尾のハイフンが単語の境界にあり、ハイフン以外の何かが先行している必要があります。

于 2010-07-14T07:29:25.010 に答える