Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用正则表达式拆分字符串_Php_Regex - Fatal编程技术网

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, '|', ']')