我有这个字符串:
EXAMPLE|abcd|[!PAGE|title]
我想这样分割它:
Array
(
[0] => EXAMPLE
[1] => abcd
[2] => [!PAGE|title]
)
如何做?
如果你不需要比你说的更多的东西,就像解析 CSV 但用
|
作为分隔符,[
作为 "
所以:(\[.*?\]+|[^\|]+)(?=\||$)
会完成我认为的工作。
编辑:更改了正则表达式,现在它接受像 [asdf]].[]asf] 这样的字符串
说明:
(\[.*?\]+|[^\|]+)
-> 这分为 2 部分:(将匹配 1.1 或 1.2)\[.*?\]+
-> 匹配 [
和 ]
[^\|]+
-> 将匹配 |
(?=\||$)
-> 这将告诉正则表达式,旁边必须是 |
或字符串结尾,以便告诉正则表达式接受像前面的示例一样的字符串。根据您的示例,您可以使用
(\[.*?\]|[^|]+)
。
preg_match_all("#(\[.*?\]|[^|]+)#", "EXAMPLE|abcd|[!PAGE|title]", $matches);
print_r($matches[0]);
// output:
Array
(
[0] => EXAMPLE
[1] => abcd
[2] => [!PAGE|title]
)
使用这个正则表达式
(?<=\||^)(((\[.*\|?.*\])|(.+?)))(?=\||$)
(?<=\||^) 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)
非正则表达式解决方案:
$str = str_replace('[', ']', "EXAMPLE|abcd|[!PAGE|title]");
$arr = str_getcsv ($str, '|', ']')
如果您期望类似“[[]]”的内容,则必须使用斜杠转义内括号,在这种情况下,正则表达式可能是更好的选择。
代码:(演示)
$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]',
)
https://www.php.net/manual/en/function.explode.php
$array= explode('|', $string);