PHP会爆炸字符串,但会将引号中的单词视为单个单词

tim*_*fey 45 php quotes explode str-replace

如何爆炸以下字符串:

Lorem ipsum "dolor sit amet" consectetur "adipiscing elit" dolor
Run Code Online (Sandbox Code Playgroud)

array("Lorem", "ipsum", "dolor sit amet", "consectetur", "adipiscing elit", "dolor")
Run Code Online (Sandbox Code Playgroud)

因此引用中的文本被视为单个单词.

这就是我现在所拥有的:

$mytext = "Lorem ipsum %22dolor sit amet%22 consectetur %22adipiscing elit%22 dolor"
$noquotes = str_replace("%22", "", $mytext");
$newarray = explode(" ", $noquotes);
Run Code Online (Sandbox Code Playgroud)

但我的代码将每个单词分成一个数组.如何将引号内的单词视为一个单词?

Bar*_*ers 82

你可以使用preg_match_all(...):

$text = 'Lorem ipsum "dolor sit amet" consectetur "adipiscing \\"elit" dolor';
preg_match_all('/"(?:\\\\.|[^\\\\"])*"|\S+/', $text, $matches);
print_r($matches);
Run Code Online (Sandbox Code Playgroud)

这将产生:

Array
(
    [0] => Array
        (
            [0] => Lorem
            [1] => ipsum
            [2] => "dolor sit amet"
            [3] => consectetur
            [4] => "adipiscing \"elit"
            [5] => dolor
        )

)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它还可以解释引用字符串中的转义引号.

编辑

一个简短的解释:

"           # match the character '"'
(?:         # start non-capture group 1 
  \\        #   match the character '\'
  .         #   match any character except line breaks
  |         #   OR
  [^\\"]    #   match any character except '\' and '"'
)*          # end non-capture group 1 and repeat it zero or more times
"           # match the character '"'
|           # OR
\S+         # match a non-whitespace character: [^\s] and repeat it one or more times
Run Code Online (Sandbox Code Playgroud)

如果匹配%22而不是双引号,你会做:

preg_match_all('/%22(?:\\\\.|(?!%22).)*%22|\S+/', $text, $matches);
Run Code Online (Sandbox Code Playgroud)

  • @prodigitalson:不,使用`preg_split(...)`你无法解释转义字符.`preg_match_all(...)`"表现得更像是一个解析器,这是更自然的事情.此外,使用`preg_split(...)`,你需要在每个空间上向前看,看看它前面有多少引号,使它成为一个'O(n ^ 2)`运算:小问题没问题字符串,但是当涉及更大的字符串时可能会减少运行时. (3认同)

Pet*_*tah 76

这会更容易str_getcsv().

$test = 'Lorem ipsum "dolor sit amet" consectetur "adipiscing elit" dolor';
var_dump(str_getcsv($test, ' '));
Run Code Online (Sandbox Code Playgroud)

给你

array(6) {
  [0]=>
  string(5) "Lorem"
  [1]=>
  string(5) "ipsum"
  [2]=>
  string(14) "dolor sit amet"
  [3]=>
  string(11) "consectetur"
  [4]=>
  string(15) "adipiscing elit"
  [5]=>
  string(5) "dolor"
}
Run Code Online (Sandbox Code Playgroud)

  • str_getcsv需要PHP 5.3. (4认同)
  • 啊,为什么我现在才发现这个功能?! (3认同)
  • 请注意,它"忽略"了引号.如果你需要他们在分裂中,那么这不会工作. (2认同)