テキスト内のスペースで区切られた単語を検出する必要があります。たとえば、私のテキストは次のとおりです。
some parent +kid -control "human right" world
ここで、 some、parent、worldを検出する必要があります。( + - ( ) < > を前後に持たないすべての単語、および引用符内のすべての単語を破棄する必要があります) したがって、この正規表現を次のように記述しpreg_match_all()
ます。
(?:^|[\s]+)((?:(?![\+\(\)\<\>\s\-\"]).)+)(?:[\s]+|$)
しかし、それはsomeとworldしか検出しません。どうすれば修正できますか?
編集
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 )
EDIT 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