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

时间:2019-06-05 11:10:55

标签: php regex explode quotes

如何爆炸以下字符串:

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

进入

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

我检查了这个答案:https://stackoverflow.com/a/2202489/11398085,但在我的字符串中没有空格链接的情况下无法正常工作。

$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

3 个答案:

答案 0 :(得分:3)

您可以使用

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

请参见regex demo

详细信息

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

请参见PHP demo

)

答案 1 :(得分:0)

您可以使用:

<?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>";
?>

答案 2 :(得分:0)

您似乎想在引号上爆炸(忽略第一个和最后一个引号),然后将引号放在元素1、3、5 ...周围,并从元素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);
}

您可以组合使用这些功能以使其更短,但是我想确保您可以看到它确实在执行您想要的功能。