1

我有这个字符串:

EXAMPLE|abcd|[!PAGE|title]

我想像这样拆分它:

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

怎么做?谢谢你。

4

5 回答 5

3

演示

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

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

解释:

  1. (\[.*?\]+|[^\|]+)-> 这一个分为 2 部分:(将匹配 1.1 或 1.2)
    1.1 \[.*?\]+-> 匹配1.2[]
    1.2之间的所有内容[^\|]+-> 将匹配包含在|
  2. (?=\||$)-> 这将告诉正则表达式旁边必须是 a|或字符串的结尾,以便告诉正则表达式像前面的示例一样接受字符串。
于 2013-01-02T11:02:20.497 回答
2

使用这个正则表达式 (?<=\||^)(((\[.*\|?.*\])|(.+?)))(?=\||$)

(?<=\||^) 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)
于 2013-01-02T11:02:05.640 回答
2

鉴于您的示例,您可以使用(\[.*?\]|[^|]+).

preg_match_all("#(\[.*?\]|[^|]+)#", "EXAMPLE|abcd|[!PAGE|title]", $matches);

print_r($matches[0]);

// output:
Array
(
    [0] => EXAMPLE
    [1] => abcd
    [2] => [!PAGE|title]
)
于 2013-01-02T11:06:51.433 回答
0

非正则表达式解决方案:

$str = str_replace('[', ']', "EXAMPLE|abcd|[!PAGE|title]");
$arr = str_getcsv ($str, '|', ']')

如果您期望像“[[]]”这样的东西,则必须用斜杠转义内括号,在这种情况下,正则表达式可能是更好的选择。

于 2013-01-02T11:52:01.500 回答
-5

http://de2.php.net/manual/en/function.explode.php

$array= explode('|', $string);
于 2013-01-02T10:58:26.487 回答