2010-12-06 7 views
1

正規表現、特により複雑な数式の周りに頭を抱えるのはむしろ時間がかかります。Regexpバックスラッシュの偶数(PHP)

現在、私は自分のマークアップ言語を書いており、エスケープして困っています。 *bold*が私に<b>bold</b>を与えるならば、それぞれの特殊文字を "エスケープ可能"にしておきたいのですが、それでは\*bold\*はそのまま残しておいて、後でバックスラッシュを取り除くことはできますが、この考えを伝える。それに先立つ数または後方散乱電子が偶数の場合

  1. 左アスタリスク;:
    は、どのように私は三つのグループを選択することができます
  2. アスタリスク間の内容;
  3. それに先行するBSの数が偶数の場合は、アスタリスクを右にします。

正規表現を1つ使用しますか? PHPのpreg_replaceに準拠する必要があります。

この\\*(\*)\S(.)+?\S\\*(\*)は、アスタリスクとコンテンツの両方を3つのグループとして選択しますが、「偶然性」やものをチェックしません。

UPDATE:

2番目の段落は、より良い私が(行われた変更は、完全にポイントを逃したので、もうそれを変更しないでください)何を意味するのか説明するために変更されました。

さらに、これにより作業が簡単になる場合は、最初に任意の二重バックスラッシュを解析して、アスタリスクの前にバックスラッシュを1つだけ確認する必要があります。

+0

'\\ * bold \\ *'は '* bold * 'を生成しますか? – kennytm

+1

これはRegExではなく、* parser *の仕事によく似ています。 – deceze

+0

@KennyTM固定、ありがとうございました! @deceze私は知りませんが、Regexpsでは人々が時にはそれらを使ってどのように魔法のことをしているのか考えることができないのはなぜか分かりません。 – Maurycy

答えて

0

まあ、私は自分の質問への答えを見つけたと思います。

まず私は、各\\を交換する必要があり、その後、このような式を使用します。

(?<!\\)  #There is no backslash before... 
\*   #...Asterisk 

(   #Non-whitespace after first and before second asterisk 
    \S .*? \S 
    | 
    \S 
) 

(?<!\\)  #There is no backslash before... 
\*   #...Asterisk 

そしてここにから私は私が望むしかし、それを微調整することができます。とにかく誰にでも入力してくれてありがとう:)。

1

方法について:

$rx = '/ 
([^\\]*|^)  # no backslash or beginning of line 
\\    # one backslash 
\*    # an asterisk 

([^*\\]+)  # one or more characters not being asterisks or BSs 

\\    # one backslash 
\*    # one asterisk 
       # "mx" = multiline,extended regex 
/mx';    

preg_replace($rx, '\1\2', $content)

+0

未知の「#」のエラーが表示され、コメントと空白を削除した場合、コンパイルに失敗しました:文字列クラスのオフセット23 * – Maurycy

+1

コードを編集しました。できます。 –

+0

いいえ、まだ動作しません。 * missing terminating]オフセット297の文字クラス*別のバックスラッシュを大括弧の2番目のセットに追加して実行します。それは私の最後の設定で何かかもしれません。私が書いたものは誤解を招くものではないかと思うが、最初の投稿をより明確にして更新した。あなたの時間のためにまだありがとう! – Maurycy

関連する問題