如何在php和javascript中使用正则表达式检测空格分隔词(在全文搜索查询中)

如何在php和javascript中使用正则表达式检测空格分隔词(在全文搜索查询中),php,javascript,regex,Php,Javascript,Regex,我需要检测文本中与空格分隔的单词。例如,我的文本是: some parent +kid -control "human right" world 现在我需要检测一些,家长,世界。(所有前后没有+-()的单词,以及引号内的所有单词都必须丢弃)因此我用preg\u match\u all()编写这个正则表达式: (?:^[s]+)(?:(?![\+\(\)\\s\-\“])+(?:[\s]+\$) 但是它只检测一些和世界。我如何修复它 编辑 我也需要它用于Javascript。但是它似乎不适用于

我需要检测文本中与空格分隔的单词。例如,我的文本是:

some parent +kid -control "human right" world
现在我需要检测一些家长世界。(所有前后没有+-()<>的单词,以及引号内的所有单词都必须丢弃)因此我用
preg\u match\u 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 ) 
$str='someparent+kid-control'我的人权“世界”;
$words=array();
$quot=假;
$discard=false;
$word='';
对于($i=0;$i一些[1]=>父[2]=>世界)
编辑 PHP的最后一种方式(这是针对多语言查询的)(特别感谢橡胶靴):

$query='someparent+kid-control'我的人权“世界”;
$result=array();
如果(预匹配所有('/(?:“[^”]+”))(?:^[\s])(?((?![\+\(\)\\s\-“]))+)/,$query,$match)){
$result=array_filter($match['q'],'strlen');
}
print_r($result);//部分、父级、世界
javascript的最后一种方式(这是针对多语言查询的)(特别感谢橡胶靴):

var query='some parent+kid-control'我的人权'世界';
var result=Array();
var-tmp;
var patt=RegExp(“(?:“[^”]+”)”);(?:(?:^\\\\s)((?:(?![\\+\(\\)\\\\\\\\\\\\\\\\\\\\-\\\”)+),“g”);
while(tmp=patt.exec(查询)){
if(typeof(tmp[1])!=='undefined')result.push(tmp[1]);
}
警报(结果);//部分、父级、世界
试试:

这不允许任何包含
+
-
的单词。这就是你的意思吗


注意:我使用一个匿名函数作为对
array\u filter()
的回调。如果您使用的是PHP<5.3,请改用命名函数,或者使用
create_function()

生成的函数,如果给定以下字符串:

 $t ='some parent +kid -control "human huhu right" world';
也可以根据您的规范用一个相当简单的表达式提取单词:

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

expr
(?:“[^”]+”)
使用引号及其内容


附录:Javascript

对于Javascript,您需要使用稍微复杂一点的方法,Javascript没有
查找断言
,我们在允许的单词前面用
(?:^ | \\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

我不明白逻辑。所有的单词都用空格分隔。为什么“world”应该匹配,而不是其他单词?你是说空格前面加一个
,而不是其他字符,比如
-
+
爆炸('.$search)
,你就有了所有的单词,用空格隔开…@Utkanos:我需要没有前缀的确切单词,比如+-()<>并且必须拒绝引号中的所有单词。这是一个搜索phrase@feeela:explode将分隔所有单词。我只需要不带前缀而不带引号的单词。@IVIR3zaM-这是至关重要的信息。请编辑问题并将其包含在那里(例如,引号中的单词应该被丢弃)。这很好。但是我有个问题。如果内部引号超过2个单词,它会将中间的单词检测为空格分隔的单词。我需要跳过引号中的所有单词。你试过代码了吗?它返回
some
parent
world
,这正是您所说的需要的输出。是的,我测试了它。如果你试着用这个短语“父母+孩子-控制”我的人权“世界,它会返回一些,父母,人类,世界。这是不正确的。必须跳过引号内的所有单词。从您发布的问题来看,我无法预测这一要求。恐怕这项要求会使事情变得更加困难。非常感谢。我也需要它来编写javascript。但它似乎不适用于javascript。我如何使用javascript呢?我现在将出去运行一段时间。如果没有其他人提供Javascript解决方案,我将尝试。请在您的问题中添加一个
Javascript
标记,删除您过于复杂的PHP解决方案,并添加一个额外的段落以请求Javascript解决方案。@IVIR3zaM-在另一个问题中进行了一些讨论之后,我简化了表达式并删除了筛选步骤。
 $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
  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]);
some,parent,world