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 )
如何分解下面的字符串:
"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 )