使用PHP,我试图通过支持像运营商这样的运营商来改进我网站上的搜索
为此,我需要将字符串拆分为两个数组.一个用于确切的单词(但没有双引号)到$ Array1()并将其他所有(自然和部分关键字)放入Array2().
正则表达式将为以下字符串实现此目的?
示例字符串($ string)
今天我正在"尝试"一个*"谷歌搜索""测试"
期望的结果
$Array1 = array(
[0]=>trying
[1]=>google search
[2]=>testing
);
$Array2 = array(
[0]=>today
[1]=>i'm
[2]=>out
[3]=>a*
);
Run Code Online (Sandbox Code Playgroud)
1)确切我已经尝试了以下精确的正则表达式,但它返回两个数组,一个有一个,一个没有双引号.我可以使用$ result [1],但可能有一个我在这里缺少的技巧.
preg_match_all(
'/"([^"]+)"/iu',
'today i\'m "trying" \'out\' a* "google search" "test"',
$result
);
Run Code Online (Sandbox Code Playgroud)
2)自然/部分以下规则返回正确的关键字,但还有几个空白值.这个正则表达式规则可能很草率,或者我应该通过array_filter()运行数组?
preg_split(
'/"([^"]+)"|(\s)/iu',
'today i\'m "trying" \'out\' a* "google search" "test"'
);
Run Code Online (Sandbox Code Playgroud)
您可以使用strtok标记化字符串.
例如,请参见手册页上的注释中从此tokenizeQuoted函数派生的此tokenizedQuoted函数strtok:
// split a string into an array of space-delimited tokens, taking double-quoted and single-quoted strings into account
function tokenizeQuoted($string, $quotationMarks='"\'') {
$tokens = array(array(),array());
for ($nextToken=strtok($string, ' '); $nextToken!==false; $nextToken=strtok(' ')) {
if (strpos($quotationMarks, $nextToken[0]) !== false) {
if (strpos($quotationMarks, $nextToken[strlen($nextToken)-1]) !== false) {
$tokens[0][] = substr($nextToken, 1, -1);
} else {
$tokens[0][] = substr($nextToken, 1) . ' ' . strtok($nextToken[0]);
}
} else {
$tokens[1][] = $nextToken;
}
}
return $tokens;
}
Run Code Online (Sandbox Code Playgroud)
这是一个使用示例:
$string = 'today i\'m "trying" out a* "google search" "test"';
var_dump(tokenizeQuoted($string));
Run Code Online (Sandbox Code Playgroud)
输出:
array(2) {
[0]=>
array(3) {
[0]=>
string(6) "trying"
[1]=>
string(13) "google search"
[2]=>
string(4) "test"
}
[1]=>
array(4) {
[0]=>
string(5) "today"
[1]=>
string(3) "i'm"
[2]=>
string(3) "out"
[3]=>
string(2) "a*"
}
}
Run Code Online (Sandbox Code Playgroud)