単純なテキスタイルパーサーを作成していて、「blockquote」の正規表現を書き込もうとしていますが、複数の新しい行を一致させるのに問題があります。例:
bq。引用の最初の行 引用の2行目 引用の3行目 見積もりの一部ではありません
を介してブロッククォートタグに置き換えられるpreg_replace()
ため、基本的には"bq."
、最初の二重改行との間のすべてを一致させる必要があります。私が管理できる最善の方法は、見積もりの最初の行を取得することです。ありがとう
この正規表現を試してください:
(?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
この受け入れられた答えは、私にとってブロックの最後の文字だけをキャプチャしました。私はこれを使用することになりました:
$text =~ /(?s)bq\.(.+?)\n\n/g
これは機能しますか?
'/(.+)\n\n/s'
「s」は単一行を表すと思います。
私の本能は私に次のようなことを教えてくれます...
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!
あなたの正規表現置換技術はすべて処理することができません、メチンク。
編集:ええと、質問を読み間違えました..「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);
質問マークは、最初のダブルリターンが見つかった後に終了ブロッククォートを追加するようにします(「貪欲ではない」と呼ばれると思います)。したがって、他のダブルリターンはそのままになります(それが必要でない場合は、明らかに削除してください)。