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认同)