使用PHP,我试图通过支持像运营商这样的运营商来改进我网站上的搜索。
为此,我需要将字符串拆分为两个数组。一个用于确切单词(但没有双引号)到$ Array1()中并将其他所有内容(自然和部分关键字)放入Array2()。
对于以下字符串,哪些正则表达式会实现此目的?
示例字符串($ string)
今天我正在“尝试”*“谷歌搜索”“测试”
期望的结果
$Array1 = array(
[0]=>trying
[1]=>google search
[2]=>testing
);
$Array2 = array(
[0]=>today
[1]=>i'm
[2]=>out
[3]=>a*
);
1)完全我已经尝试了以下精确的正则表达式,但它返回了两个数组,一个有一个,一个没有双引号。我可以使用$ result [1],但可能有一个我在这里缺少的技巧。
preg_match_all(
'/"([^"]+)"/iu',
'today i\'m "trying" \'out\' a* "google search" "test"',
$result
);
2)自然/部分以下规则会返回正确的关键字,但会返回几个空白值。这个regexp规则可能很草率,或者我应该通过array_filter()运行数组?
preg_split(
'/"([^"]+)"|(\s)/iu',
'today i\'m "trying" \'out\' a* "google search" "test"'
);
答案 0 :(得分:5)
您可以使用strtok
来标记字符串。
例如,请参阅从此tokenizedQuoted
function in the comments on the strtok
manual page派生的此tokenizeQuoted
函数:
// 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;
}
以下是使用示例:
$string = 'today i\'m "trying" out a* "google search" "test"';
var_dump(tokenizeQuoted($string));
输出:
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*"
}
}