1

テキスト内のスペースで区切られた単語を検出する必要があります。たとえば、私のテキストは次のとおりです。

some parent +kid -control "human right" world

ここで、 someparentworldを検出する必要があります。( + - ( ) < > を前後に持たないすべての単語、および引用符内のすべての単語を破棄する必要があります) したがって、この正規表現を次のように記述しpreg_match_all()ます。

(?:^|[\s]+)((?:(?![\+\(\)\<\>\s\-\"]).)+)(?:[\s]+|$)

しかし、それはsomeworldしか検出しません。どうすれば修正できますか?

編集

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
4

2 に答える 2

1

次の文字列が指定されている場合:

 $t ='some parent +kid -control "human huhu right" world';

かなり単純な表現で、仕様に従って単語を抽出することも可能です。

 $r = '/ (?:" [^"]+ ")? \s?
         (?<!\S) \b (\w+)
       /x';
 preg_match_all($r, $t, $matches);

これにより、次のようになります。

foreach($matches[1] as $m) echo $m . "\n";

some
parent
world

使用した手法:

expr(?:" [^"]+ ")?は、引用符とその内容を消費します。


補遺:Javascript

Javascriptの場合、もう少し複雑なアプローチを使用する必要があります。Javascriptにはありません。許可された単語の前で、それらlookbehind assertions偽造します。(?:^|\\s)

これは機能します:

  var t = 'some parent +kid -control "human huhu right" world';
  var r = /(?:"[^"]+")?(?:^|\s)(\b\w+)/g;
  var a = [];
  while(m = r.exec(t)) a.push(m[1]);

ここでも同じ手法を使用します$1。必要な単語に対してキャプチャされたサブマッチを生成します。

配列の内容a、(document.getElementById("myhtml").innerHTML = a;)には、次のものが含まれます。

some,parent,world
于 2012-07-30T13:05:11.227 に答える
1

試す:

$str = 'some parent +kid -control "human right" world';
$words = array_filter(explode(' ', $str), function($word) {
    return preg_match('/^[^-+"]*$/', $word);
});
echo implode(', ', $words); //some, parent, world

+-またはを含む単語は許可されません"。そうですか?

へのコールバックとして無名関数を使用することに注意してくださいarray_filter()。PHP < 5.3 を使用している場合は、代わりに名前付き関数を使用するか、create_function().

于 2012-07-30T12:29:23.787 に答える