我需要检测文本中用空格分隔的单词。例如我的文字是:
some parent +kid -control "human right" world
现在我需要检测一些,父母,世界。(之前和之后没有 + - ( ) < > 的所有单词,引号内的所有单词都必须丢弃)所以我用以下方式编写这个正则表达式preg_match_all()
:
(?:^|[\s]+)((?:(?![\+\(\)\<\>\s\-\"]).)+)(?:[\s]+|$)
但它只检测到一些和世界。我该如何解决?
编辑
我也需要它用于Javascript。但它似乎不适用于 Javascript。我怎么能用javascript做到这一点?
编辑
我找到了一个解决方案,但它似乎很愚蠢。你的想法是什么?
$str = 'some parent +kid -control "my human right" world';
$words=array();
$quot=false;
$discard=false;
$word='';
for($i=0;$i<=strlen($str);$i++){
$chr=substr($str,$i,1);
if($chr=='"'){
if($quot){
$quot=false;
}else{
$quot=true;
}
continue;
}
if($quot)continue;
if($chr==' '||$i==strlen($str)){
if(strlen($word)&&!$discard)$words[]=$word;
$discard=false;
$word='';
continue;
}elseif(in_array($chr,array('+','-','(',')','<','>'))){
$discard=true;
continue;
}
$word.=$chr;
}
print_r($words);//Array ( [0] => some [1] => parent [2] => world )
编辑 PHP 的最终方式(这是用于多语言查询)(特别感谢橡胶靴):
$query='some parent +kid -control "my human right" world';
$result=array();
if(preg_match_all('/(?:"[^"]+")|(?:^|[\s])(?P<q>(?:(?![\+\(\)\<\>\s\-\"]).)+)/',$query,$match)){
$result=array_filter($match['q'],'strlen');
}
print_r($result);// some,parent,world
javascript的最终方式(这是用于多语言查询)(特别感谢橡胶靴):
var query='some parent +kid -control "my human right" world';
var result=Array();
var tmp;
var patt=RegExp('(?:"[^"]+")|(?:(?:^|\\s)((?:(?![\\+\\(\\)\\<\\>\\s\\-\\"]).)+))', 'g');
while(tmp = patt.exec(query)){
if(typeof(tmp[1])!=='undefined') result.push(tmp[1]);
}
alert(result);// some,parent,world