如何爆炸以下字符串:
"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
答案 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);
}
您可以组合使用这些功能以使其更短,但是我想确保您可以看到它确实在执行您想要的功能。