我有这个字符串:
EXAMPLE|abcd|[!PAGE|title]
我想像这样分开它:
Array
(
[0] => EXAMPLE
[1] => abcd
[2] => [!PAGE|title]
)
怎么做? 谢谢。
答案 0 :(得分:3)
如果您不需要比您所说的更多内容,就像解析CSV一样,但|
为分隔符,[
为"
,所以:(\[.*?\]+|[^\|]+)(?=\||$)
会做我认为的工作。
编辑:更改正则表达式,现在它接受像[asdf]]这样的字符串。[] asf]
说明:
(\[.*?\]+|[^\|]+)
- >这一部分分为两部分:(将匹配1.1或1.2)\[.*?\]+
- >匹配[
和]
之间的所有内容
1.2 [^\|]+
- >将匹配|
(?=\||$)
- >这将告诉正则表达式,其旁边必须是|
或字符串的结尾,以便告诉正则表达式接受类似于前面示例的字符串。答案 1 :(得分:2)
使用此regex (?<=\||^)(((\[.*\|?.*\])|(.+?)))(?=\||$)
(?<=\||^) 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)
答案 2 :(得分:2)
根据您的示例,您可以使用(\[.*?\]|[^|]+)
。
preg_match_all("#(\[.*?\]|[^|]+)#", "EXAMPLE|abcd|[!PAGE|title]", $matches);
print_r($matches[0]);
// output:
Array
(
[0] => EXAMPLE
[1] => abcd
[2] => [!PAGE|title]
)
答案 3 :(得分:0)
非正则表达式解决方案:
$str = str_replace('[', ']', "EXAMPLE|abcd|[!PAGE|title]");
$arr = str_getcsv ($str, '|', ']')
如果您期望这样的事情&#34; [[]]&#34;,您可以使用斜杠来逃避内部括号,在这种情况下,正则表达式可能是更好的选择。
答案 4 :(得分:-5)
http://de2.php.net/manual/en/function.explode.php
$array= explode('|', $string);