在不在方括号之间的管道上分割字符串

问题描述 投票:0回答:6

我有这个字符串:

EXAMPLE|abcd|[!PAGE|title]

我想这样分割它:

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

如何做?

php regex split delimited
6个回答
3
投票

演示

如果你不需要比你说的更多的东西,就像解析 CSV 但用

|
作为分隔符,
[
作为
"
所以:
(\[.*?\]+|[^\|]+)(?=\||$)
会完成我认为的工作。

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

说明:

  1. (\[.*?\]+|[^\|]+)
    -> 这分为 2 部分:(将匹配 1.1 或 1.2)
    1.1
    \[.*?\]+
    -> 匹配
    [
    ]

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

2
投票

根据您的示例,您可以使用

(\[.*?\]|[^|]+)

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

print_r($matches[0]);

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

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)

0
投票

非正则表达式解决方案:

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

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


0
投票
  1. 匹配和取消方括号包裹的子字符串。
  2. 在管道上分开。

代码:(演示

$txt = 'EXAMPLE|abcd|[!PAGE|title]';

var_export(
    preg_split('#\[[^]]*](*SKIP)(*FAIL)|\|#', $txt, 0, PREG_SPLIT_NO_EMPTY)
);

输出:

array (
  0 => 'EXAMPLE',
  1 => 'abcd',
  2 => '[!PAGE|title]',
)

-5
投票
© www.soinside.com 2019 - 2024. All rights reserved.