4

単純なテキスタイルパーサーを作成していて、「blockquote」の正規表現を書き込もうとしていますが、複数の新しい行を一致させるのに問題があります。例:

bq。引用の最初の行
引用の2行目
引用の3行目

見積もりの​​一部ではありません

を介してブロッククォートタグに置き換えられるpreg_replace()ため、基本的には"bq."、最初の二重改行との間のすべてを一致させる必要があります。私が管理できる最善の方法は、見積もりの​​最初の行を取得することです。ありがとう

4

5 に答える 5

6

この正規表現を試してください:

(?s)bq\.((?!(\r?\n){2}).)*+

意味:

(?s)           # enable dot-all option
b              # match the character 'b'
q              # match the character 'q'
\.             # match the character '.'
(              # start capture group 1
  (?!          #   start negative look ahead
    (          #     start capture group 2
      \r?      #       match the character '\r' and match it once or none at all
      \n       #       match the character '\n'
    ){2}       #     end capture group 2 and repeat it exactly 2 times
  )            #   end negative look ahead
  .            #   match any character
)*+            # end capture group 1 and repeat it zero or more times, possessively

一致するの\r?\nは、Windows、* nix、および(新しい)MacOSの改行です。実際の古いMacコンピュータを説明する必要がある場合は、それにシングル\rを追加します。\r?\n|\r

于 2010-02-08T14:47:42.837 に答える
1

この受け入れられた答えは、私にとってブロックの最後の文字だけをキャプチャしました。私はこれを使用することになりました:

$text =~ /(?s)bq\.(.+?)\n\n/g
于 2015-11-11T23:18:57.497 に答える
0

これは機能しますか?

'/(.+)\n\n/s'

「s」は単一行を表すと思います。

于 2010-02-08T14:35:33.077 に答える
0

私の本能は私に次のようなことを教えてくれます...

preg_match("/^bq\. (.+?)\n\n/s", $input, $matches)

上記の仲間が言うように、正規表現の最後にあるsフラグは、が改行文字と一致することを意味します。通常、これがなければ、RegExsは一種の1行のものです。/.

?次に、の後ろの疑問符.+は貪欲でない一致を示し、可能な.+限り一致しません。代わりに、可能な最小値と一致するため\n\n、最初に使用可能な二重線と一致します。

テキスタイルの機能をどの程度サポートする予定ですか?テキスタイルでは次のようなことができるため、正規表現はかなり複雑になる可能性があります...

bq.. This is a block quote

This is still a block quote

また...

bq(funky). This is a block quote belonging to the class funky!

bq{color:red;}. Block quote with red text!

あなたの正規表現置換技術はすべて処理することができません、メチンク。

于 2010-02-08T14:43:45.497 に答える
0

編集:ええと、質問を読み間違えました..「bq」重要でした。

echo preg_replace('/^bq\.(.+?)\n\n/s', '<blockquote>$1</blockquote>', $str, 1);

Webフォームを介して入力されるデータには、\nだけでなく\r\nが含まれる場合があります。

echo preg_replace('/^bq\.(.+?)\r\n\r\n/s', '<blockquote>$1</blockquote>', $str, 1);

質問マークは、最初のダブルリターンが見つかった後に終了ブロッククォートを追加するようにします(「貪欲ではない」と呼ばれると思います)。したがって、他のダブルリターンはそのままになります(それが必要でない場合は、明らかに削除してください)。

于 2010-02-08T14:44:33.763 に答える