0

この文字列authors[0][system:id]があり、次を返す正規表現が必要です。

array('authors', '0', 'system:id')

何か案は?

ありがとう。

4

2 に答える 2

3

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 ) 
于 2013-01-15T10:09:47.690 に答える
1

最も単純なアプローチを取ると、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);

...必要な結果が表示されます。

動いているのを見る

于 2013-01-15T10:24:02.437 に答える