web-dev-qa-db-ja.com

中括弧regex php間のすべての値を抽出する

このフォームにコンテンツがあります

$content ="<p>This is a sample text where {123456} and {7894560} ['These are samples']{145789}</p>";

以下に示すような配列の波括弧内のすべての値が必要です。

array("0"=>"123456","1"=>"7894560","2"=>"145789")

私はこのコードで試しました:

<?php
preg_match_all("/\{.*}\/s", $content, $matches);
?>

しかし、ここでは最初の中括弧からコンテンツで見つかった最後の括弧までの値を取得しています。上記の形式で配列を取得するにはどうすればよいですか?私が使用したパターンが間違っていることを知っていました。上記の望ましい出力を得るためには何が必要ですか?

17
Ganesh Babu

このようにしてください...

<?php
$content ="<p>This is a sample text where {123456} and {7894560} ['These are samples']{145789}</p>";
preg_match_all('/{(.*?)}/', $content, $matches);
print_r(array_map('intval',$matches[1]));

出力:

Array
(
    [0] => 123456
    [1] => 7894560
    [2] => 145789
)
23

2つのコンパクトなソリューションは言及されていません:

(?<={)[^}]*(?=})

そして

{\K[^}]*(?=})

これらを使用すると、キャプチャグループなしで直接試合にアクセスできます。例えば:

$regex = '/{\K[^}]*(?=})/m';
preg_match_all($regex, $yourstring, $matches);
// See all matches
print_r($matches[0]);

説明

  • (?<={) lookbehindは、先行するのが開き括弧であると断言します。
  • オプション2では、{は左中括弧に一致し、次に\Kは、これまでに一致したものを破棄するようにエンジンに指示します。 \KはPerl、PHPおよびR(PCREエンジンを使用)、およびRuby 2.0+
  • [^}]否定された文字クラスは、右中括弧ではない1つの文字を表します。
  • そしてその *数量詞がそのゼロ回以上一致します
  • 先読み(?=})は、後に続くのが中括弧であると断言します。

参照

21
zx81

デモ: https://eval.in/84197

$content ="<p>This is a sample text where {123456} and {7894560} ['These are samples']{145789}</p>";
preg_match_all('/{(.*?)}/', $content, $matches);
foreach ($matches[1] as $a ){
echo $a." ";
}

出力:

123456 7894560 145789 
3
Awlad Liton