使用正则表达式拆分字符串

时间:2013-01-02 10:56:36

标签: php regex

我有这个字符串:

EXAMPLE|abcd|[!PAGE|title]

我想像这样分开它:

Array
(
    [0] => EXAMPLE
    [1] => abcd
    [2] => [!PAGE|title]
)

怎么做? 谢谢。

5 个答案:

答案 0 :(得分:3)

DEMO

如果您不需要比您所说的更多内容,就像解析CSV一样,但|为分隔符,[",所以:(\[.*?\]+|[^\|]+)(?=\||$)会做我认为的工作。

编辑:更改正则表达式,现在它接受像[asdf]]这样的字符串。[] asf]

说明:

  1. (\[.*?\]+|[^\|]+) - >这一部分分为两部分:(将匹配1.1或1.2)
    1.1 \[.*?\]+ - >匹配[]之间的所有内容 1.2 [^\|]+ - >将匹配|
  2. 所包含的所有内容
  3. (?=\||$) - >这将告诉正则表达式,其旁边必须是|或字符串的结尾,以便告诉正则表达式接受类似于前面示例的字符串。

答案 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);