このフォームにコンテンツがあります
$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);
?>
しかし、ここでは最初の中括弧からコンテンツで見つかった最後の括弧までの値を取得しています。上記の形式で配列を取得するにはどうすればよいですか?私が使用したパターンが間違っていることを知っていました。上記の望ましい出力を得るためには何が必要ですか?
このようにしてください...
<?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
)
2つのコンパクトなソリューションは言及されていません:
(?<={)[^}]*(?=})
そして
{\K[^}]*(?=})
これらを使用すると、キャプチャグループなしで直接試合にアクセスできます。例えば:
$regex = '/{\K[^}]*(?=})/m';
preg_match_all($regex, $yourstring, $matches);
// See all matches
print_r($matches[0]);
説明
(?<={)
lookbehindは、先行するのが開き括弧であると断言します。{
は左中括弧に一致し、次に\K
は、これまでに一致したものを破棄するようにエンジンに指示します。 \K
はPerl、PHPおよびR(PCRE
エンジンを使用)、およびRuby 2.0+[^}]
否定された文字クラスは、右中括弧ではない1つの文字を表します。*
数量詞がそのゼロ回以上一致します(?=})
は、後に続くのが中括弧であると断言します。参照
$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