Php 使用正则表达式拆分字符串
我有这个字符串:Php 使用正则表达式拆分字符串,php,regex,Php,Regex,我有这个字符串: EXAMPLE|abcd|[!PAGE|title] 我想这样分割它: Array ( [0] => EXAMPLE [1] => abcd [2] => [!PAGE|title] ) 怎么做? 谢谢。 使用此(? 如果你不需要比你说的更多的东西,就像解析一个CSV,但是用作为分隔符,[作为“”,所以:(\[.*.\]+[^\\\]+)(?=\\\\.$)将完成我认为的工作 编辑:更改了正则表达式,现在它接受像[asdf].[]a
EXAMPLE|abcd|[!PAGE|title]
我想这样分割它:
Array
(
[0] => EXAMPLE
[1] => abcd
[2] => [!PAGE|title]
)
怎么做?
谢谢。
使用此(?
如果你不需要比你说的更多的东西,就像解析一个CSV,但是用
作为分隔符,[
作为“
”,所以:(\[.*.\]+[^\\\]+)(?=\\\\.$)
将完成我认为的工作
编辑:更改了正则表达式,现在它接受像[asdf].[]asf]这样的字符串
说明:
(\[.*?\]+\[^\\\]+)
->这一部分分为两部分:(将匹配1.1或1.2)
1.1\[.*?\]+
->匹配[
和]
1.2[^\|]+
->将匹配.
(?=\\\\\\\\\\\\\\$)
->这将告诉正则表达式,它旁边必须是一个
或字符串的结尾,以便告诉正则表达式接受前面示例中的字符串
根据您的示例,您可以使用(\[.*?\]\[^[124;]+)
非正则表达式解决方案:
$str = str_replace('[', ']', "EXAMPLE|abcd|[!PAGE|title]");
$arr = str_getcsv ($str, '|', ']')
如果您预期会出现这种情况“[[]]",您必须用斜杠避开内括号,在这种情况下,regex可能是更好的选择。视情况而定。您是否有更多关于要求的详细信息?从您的示例中,您可以使用固定大小的子字符串…如果您是php 5.3+,这将是最好的选择:@DarkNeo,它不必是CSV。它是CSV样式,您可以定义delimiter和enclosure字符,使其适合您的example@a3f附件必须是单个字符,因此str_getcsv在这里不起作用数组([0]=>示例[1]=>abcd[2]=>[!PAGE[3]=>title])这也会打断括号中的部分。好的。那么,把它们放回一起。它也起作用,但我认为@Javier的变体更好:)无论如何谢谢你。@Darkeno,当字符串包含分隔的[
或]
时,Javier的正则表达式不起作用,例如示例| abcd |[!PAGE | title]]
你能解释一下它的作用吗,而不仅仅是向OP@Gordon跟随链接,它包含了伟大的description@burning_LEGION我不想跟随链接。我想让你改进答案,让它真正教给人们一些东西。把一个链接放在一个参考上是可以的,但是一些新加入Regex的人仍然很难理解你的模式。因此,我请您解释一下。@Supericy-我认为preg_split在这里更合适。@wojciechzylinski它匹配
字符之间的所有内容,因此使用preg_split与此模式只会返回一堆
。你的正则表达式很好,我对你的答案投了赞成票。我只是认为使用preg_split(使用修改的正则表达式)会更好。与其说是问题,不如说是偏好。
(?<=\||^) 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)
preg_match_all("#(\[.*?\]|[^|]+)#", "EXAMPLE|abcd|[!PAGE|title]", $matches);
print_r($matches[0]);
// output:
Array
(
[0] => EXAMPLE
[1] => abcd
[2] => [!PAGE|title]
)
$str = str_replace('[', ']', "EXAMPLE|abcd|[!PAGE|title]");
$arr = str_getcsv ($str, '|', ']')