この文字列authors[0][system:id]
があり、次を返す正規表現が必要です。
array('authors', '0', 'system:id')
何か案は?
ありがとう。
PHP のpreg_split()
を使用するだけで、RegEx と同様に要素の配列を返しますexplode()
。
[
またはで文字列を分割し]
、提供された配列 の最後の要素 (空の文字列) を削除し$tokens
ます。
編集: また、array_splice($array, int $offset, int $lenth)
このアイテムも空の文字列であるため、 で 3 番目の要素を削除します。
正規表現は、いずれかまたは文字/[\[\]]/
に一致することを意味します[
]
$string = "authors[0][system:id]";
$tokens = preg_split("/[\]\[]/", $string);
array_pop($tokens);
array_splice($tokens, 2, 1);
//rest of your code using $tokens
$tokens
これが実行された後の形式は次のとおりです。
Array ( [0] => authors [1] => 0 [2] => system:id )
最も単純なアプローチを取ると、3 つの個々のパーツを一致させるだけです。したがって、まず、括弧で囲まれていないトークンを探します。
[a-z]+
次に、括弧とその間の値を探します。
\[[^\]]+\]
そして、2 番目のステップを繰り返します。
()
必要な実際の値を抽出するには、キャプチャ グループを追加する必要もあります。
したがって、すべてをまとめると、次のようになります。
([a-z]+)\[([^\]]+)\]\[([^\]]+)\]
その式を使用するpreg_match()
と、必要な値が 3 番目の引数に渡された参照配列に抽出されます (このように)。しかし、上記の式は非常に読みにくい句読点の集まりであり、結果の配列には、不要な余分な要素が含まれていることに気付くでしょう。preg_match()
一致した文字列全体を最初のインデックスに配置します。出力配列。近づいていますが、理想的ではありません。
ただし、@ AlienHoboken が正しく指摘し、ほぼ正しく実装しているため、より簡単な解決策は、ブラケットの位置に基づいて文字列を分割することです。まず、必要な式 (または少なくとも、私が使用する式) を見てみましょう。
(?:\[|\])+
これは、またはのいずれかが少なくとも1 回出現することを探し、そのブロックを分割の区切り文字として使用します。これはまさに必要なもののように思えますが、実行すると小さな問題が発生することがわかります。[
]
array('authors', '0', 'system:id', '')
その余分な空の文字列はどこから来たのですか? 入力文字列の最後の文字が区切り文字式と一致するため、分割位置として扱われ、空の文字列が結果に追加されます。
これは、正規表現に基づいて分割する場合によくある問題です。幸運なことに、PCRE はこれを認識しており、それを回避する簡単な方法であるPREG_SPLIT_NO_EMPTY
フラグを提供しています。
したがって、これを行うと:
$str = 'authors[0][system:id]';
$expr = '/(?:\[|\])+/';
$result = preg_split($expr, $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($result);
...必要な結果が表示されます。