私はこの文字列を持っています:
EXAMPLE|abcd|[!PAGE|title]
私はそれを次のように分割したい:
Array
(
[0] => EXAMPLE
[1] => abcd
[2] => [!PAGE|title]
)
どうやってするの?ありがとうございました。
あなたが言った以上に何も必要ない場合は、CSV を解析するようなものですが、|
区切り記号[
として"
使用(\[.*?\]+|[^\|]+)(?=\||$)
すると、私が思うに作業を行います。
編集: 正規表現を変更し、[asdf]].[]asf] のような文字列を受け入れるようになりました
説明:
(\[.*?\]+|[^\|]+)
-> これは 2 つの部分に分かれています: (1.1 または 1.2 に一致します) \[.*?\]+
の間のすべてに一致します-> で囲まれたすべてに一致します[
]
[^\|]+
|
(?=\||$)
-> これは正規表現に、その次が a または文字列の末尾でなければならないこと|
を伝え、前の例のように文字列を受け入れるように正規表現に伝えます。この正規表現を使用します (?<=\||^)(((\[.*\|?.*\])|(.+?)))(?=\||$)
(?<=\||^) Positive LookBehind
1st alternative: \|Literal `|`
2nd alternative: ^Start of string
1st Capturing group (((\[.*\|?.*\])|(.+?)))
2nd Capturing group ((\[.*\|?.*\])|(.+?))
1st alternative: (\[.*\|?.*\])
3rd Capturing group (\[.*\|?.*\])
\[ Literal `[`
. infinite to 0 times Any character (except newline)
\| 1 to 0 times Literal `|`
. infinite to 0 times Any character (except newline)
\] Literal `]`
2nd alternative: (.+?)
4th Capturing group (.+?)
. 1 to infinite times [lazy] Any character (except newline)
(?=\||$) Positive LookAhead
1st alternative: \|Literal `|`
2nd alternative: $End of string
g modifier: global. All matches (don't return on first match)
あなたの例を考えると、を使用できます(\[.*?\]|[^|]+)
。
preg_match_all("#(\[.*?\]|[^|]+)#", "EXAMPLE|abcd|[!PAGE|title]", $matches);
print_r($matches[0]);
// output:
Array
(
[0] => EXAMPLE
[1] => abcd
[2] => [!PAGE|title]
)
非正規表現ソリューション:
$str = str_replace('[', ']', "EXAMPLE|abcd|[!PAGE|title]");
$arr = str_getcsv ($str, '|', ']')
この「[[]]」のようなものを期待する場合は、スラッシュで括弧内をエスケープする必要があります。この場合、正規表現の方が適している可能性があります。
http://de2.php.net/manual/en/function.explode.php
$array= explode('|', $string);