1

次のコードがあります。

$text = "Lorem ipsum dolor sit amet, [b]consectetur adipiscing elit[/b]. 
Nunc lorem velit, lacinia ut commodo in, suscipit vitae magna. 
Nam imperdiet neque blandit semper tempus. 
Curabitur sapien ante, vestibulum vitae ante a, condimentum dignissim tortor. Aenean adipiscing tincidunt lorem, non eleifend tellus suscipit a. Nulla convallis [b]
pulvinar ligula[/b], at tempor ante. Fusce a tellus enim. Vivamus nibh eros, ultrices at auctor quis, fringilla nec dolor. Aenean nec tincidunt odio, id pulvinar felis. Pellentesque in augue volutpat, gravida nibh eu, lobortis augue.";

preg_match_all("#(\[b\].*\[/b\])#s", $text, $value);

my$valueは最初の [b] から最後の [/b] に戻っています。各ペアを個別に一致させる必要があります。

私が理解しているようにs、最後に を使用して複数の行を選択する必要がありますが、*は貪欲すぎます。?文字数が異なる可能性があるため、a だけを使用することはできません...何が欠けていますか?

4

2 に答える 2

1

怠惰な量指定子を回避する別の方法:

preg_match_all('~\[b](?>[^[]++|\[(?!/b]))*+\[/b]~', $text, $value);

これにより、次の 2 つの問題を回避できます。

  1. 文字クラスは各左角括弧で停止するため、貪欲な量指定子は問題ではありません
  2. ドットを使用しないため、「s」修飾子と改行は気にしません。
于 2013-10-23T20:23:19.250 に答える