PHP 仅在正斜杠前面没有反斜杠时才在正斜杠上拆分字符串


PHP Split String on Forward Slash Only If It Is Not Preceded By A Backslash

我正在为我的 SlashCategory 制作一个解析器,这需要我根据/字符拆分(或标记化)每个字符串。我正在使用PHP的explode()函数,效果很好。例如,它需要以下内容:

Book/Title/Lord Of The Flies/Author/William Golding

并创建一个数组:

[0] Book
[1] Title
[2] Lord Of The Flies
[3] Author
[4] William Golding

但是,我有一个问题。如果正斜杠前面是反斜杠,我不希望explode()分解字符串。例如:

Url/Google/http:'/'/www.google.com

我想要一个包含以下内容的数组:

[0] Url
[1] Google
[2] http://www.google.com

不:

[0] Url
[1] Google
[2] http:
[3] 
[4] www.google.com

我该怎么做?

使用preg_split(见 http://php.net/manual/en/function.preg-split.php)。例:

$input = 'Url/Google/http:'/'/www.google.com';
$output = preg_split('|(?<!''')/|', $input); //Yes, thats 3 times a backslash

现在,$output中的数据仍将包含您转义的斜杠,您需要取消转义它们,如下所示:

$output = preg_split('|(?<!''')/|', $input);
array_walk(
    $output,
    function(&$item){
        $item = str_replace('''/', '/', $item);
    }
);

哈,我知道这有其缺点,但一行可能是这样的:

<?php
    $s = "Url/Google/http:'/'/www.google.com";
    var_dump (explode('#####',str_replace('''#####','/',str_replace('/','#####',$s))));
?>

尽管您必须找到除"#####"之外的实用内容,因为您可能有一个可以解析的字符串。