PHP 分解字符串,但将引号中的单词视为单个单词

PHP explode strings, but treat words in quotes as a single word

如何分解下面的字符串:

"foo bar"ANDbar"foo"AND"foofoo" lorem "impsum"

进入

array('"foo bar"', 'ANDbar', '"foo"', 'AND',' "foofoo"', "lorem", '"impsum"')

我检查了这个答案: 但如果字符串中没有 space link 就无法工作。

$text = '"foo bar"ANDbar"foo"AND"foofoo" lorem "impsum"';
preg_match_all('/"(?:\\.|[^\\"])*"|\S+/', $text, $matches);
print_r($matches);

结果:

0 => array:7 [
 0 => ""foo bar""
    1 => "ANDbar"foo"AND"foofoo""
    2 => "lorem"
    3 => ""impsum""
  ]

但我需要这个:

0 => array:7 [
 0 => ""foo bar""
    1 => "ANDbar"
    2 => ""foo""
    3 => "AND"
    4 => ""foofoo""
    5 => "lorem"
    6 => ""impsum""
  ]

谢谢 :D

您可以使用:

<?php

$orgstr = '"foo bar"ANDbar"foo"AND"foofoo" lorem "impsum"';
$org_arr = explode('"',$orgstr);

$chk = 0;
$new_arr = array();
foreach($org_arr as $k=>$val){
     if($val=='') continue;
     if($chk%2==0) array_push($new_arr,'""'.trim($val).'""'); else array_push($new_arr,'"'.trim($val).'"');
     $chk++;
}

echo "<br><pre>";
print_r($new_arr);
echo "</pre>";
?>

您似乎想要展开引号(忽略第一个和最后一个引号),然后将引号放在元素 1、3、5...和 ​​trim 元素 2、4、6 的空白处...如果是这样的话,你完全可以这样做:

$str = '"foo bar"ANDbar"foo"AND"foofoo" lorem "impsum"';
// ignore first/last quote:
$str = trim($str, '"');
// explode on quotes
$a = explode('"', $str);
foreach($a as $i=>$v) {
  // Place quotes around indexes 1, 3, 5...
  if($i%2 == 1) $a[$i] = '"'.$v.'"';
  // Trim whitespace around indexes 2, 4, 6...
  if($i%2 == 0) $a[$i] = trim($v);
}

您可以组合这些函数以使其更短,但我想确保您可以看到它完全符合您的要求。

您可以使用

if (preg_match_all('~(?|"([^\\"]*(?:\\.[^"\\]*)*)"|([^\s"]+))~s', $s, $matches)) 
{
    print_r($matches[1]);
}

参见regex demo

详情

  • (?| - 启动分支重置组:
    • " - 一个 " 字符
    • ([^\\"]*(?:\\.[^"\\]*)*) - 第 1 组:除 \" 之外的任何 0+ 个字符,后跟任何转义字符的 0 次或多次重复,然后是除 [ 以外的任何 0+ 个字符=16=] 和 "
    • " - 一个 " 字符
  • | - 或者
    • ([^\s"]+) - 第 1 组:除空格和 "
    • 之外的一个或多个字符
  • ) - 分支重置组结束。

参见 PHP demo:

$s = '"foo bar"ANDbar"foo"AND"foofoo" lorem "impsum"';
if (preg_match_all('~(?|"([^\\"]*(?:\\.[^"\\]*)*)"|([^\s"]+))~s', $s, $matches)) 
{
    print_r($matches[1]);
}
// => Array ( [0] => foo bar [1] => ANDbar [2] => foo [3] => AND [4] => foofoo [5] => lorem [6] => impsum )