私はPHPを使用しており、次のようなテキストがあります。
first [abc] middle [xyz] last
ブラケットの内側と外側を取得する必要があります。StackOverflowで検索すると、中身を取得するためのパターンが見つかりました。
preg_match_all('/\[.*?\]/', $m, $s)
今、私は外にあるものを取得するためのパターンを知りたいです。
よろしく!
私はPHPを使用しており、次のようなテキストがあります。
first [abc] middle [xyz] last
ブラケットの内側と外側を取得する必要があります。StackOverflowで検索すると、中身を取得するためのパターンが見つかりました。
preg_match_all('/\[.*?\]/', $m, $s)
今、私は外にあるものを取得するためのパターンを知りたいです。
よろしく!
preg_split
これには次のように使用できます。
$input ='first [abc] middle [xyz] last';
$arr = preg_split('/\[.*?\]/',$input);
print_r($arr);
出力:
Array
(
[0] => first
[1] => middle
[2] => last
)
これにより、出力に周囲のスペースができます。それらが必要ない場合は、次を使用できます。
$arr = preg_split('/\s*\[.*?\]\s*/',$input);
preg_split
パターンに基づいて文字列を分割します。ここでのパターンの後には、。が[
続くものが続き]
ます。何にでも一致する正規表現は.*
です。また[
、]
charクラスに使用される正規表現メタ文字です。文字通りそれらを一致させたいので、取得するためにそれらをエスケープする必要があります\[.*\]
。.*
デフォルトでは貪欲であり、可能な限り一致しようとします。この場合、それは一致しabc] middle [xyz
ます。これを回避するために、?
を与えるためにそれを追加することによってそれを貪欲ではないようにします\[.*?\]
。]
ここでの私たちの定義は、実際には私たちが使用できる以外のものを意味するので\[[^]]*?\]
編集:
の内側と外側の両方にある単語を抽出する場合は[]
、次を使用できます。
$arr = preg_split('/\[|\]/',$input);
[
またはで文字列を分割します]
preg_matchの代わりにpreg_splitを使用してください。
preg_split('/\[.*?\]/', 'first [abc] middle [xyz] last');
結果:
array(3) {
[0]=>
string(6) "first "
[1]=>
string(8) " middle "
[2]=>
string(5) " last"
}
$inside = '\[.+?\]';
$outside = '[^\[\]]+';
$or = '|';
preg_match_all(
"~ $inside $or $outside~x",
"first [abc] middle [xyz] last",
$m);
print_r($m);
以下の冗長
preg_match_all("~\[.+?\]|[^\[\]]+~", $str, $matches)
誰もがpreg_splitを使うべきだと言っていますが、あなたのニーズに合った表現で答えたのは1人だけで、それは少し複雑だと思います。複雑ではなく、少し冗長ですが、彼はそれに対抗するために答えを更新しました。
この表現は、ほとんどの回答が述べているものです。
/\[.*?\]/
しかし、それは印刷されるだけです
Array
(
[0] => first
[1] => middle
[2] => last
)
中括弧の内側と外側に何が必要かを述べた場合、更新は次のようになります。
/[\[.*?\]]/
これはあなたに与えます:
Array
(
[0] => first
[1] => abc
[2] => middle
[3] => xyz
[4] => last
)
しかし、空白をキャプチャしていることがわかるように、さらに一歩進んでそれらを取り除きましょう。
/[\s]*[\[.*?\]][\s]*/
これにより、望ましい結果が得られます。
Array
(
[0] => first
[1] => abc
[2] => middle
[3] => xyz
[4] => last
)
これがあなたが探している表現だと思います。