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