匹配文件中的单词与正则表达式php

时间:2016-06-23 03:44:27

标签: php regex

我是regex和php的新手。我知道这很简单,但我无法得到它。现在,我有文件words.txt包含:

happy
sad
laugh

我想找到与我的words.txt:

匹配这句话
  

我很高兴

到目前为止,我已经尝试了这个,但它无效,因为它读作句子而不是单词:(尚未实现正则表达式,我很困惑)

$input0= "I am happy";
$handle = fopen('words.txt', 'r');
$valid = false; 
while (($buffer = fgets($handle)) !== false) {
if (strpos($buffer, $input0) !== false) { // here's the problem
    $valid = TRUE;
    break;
   }      
}
if($valid == TRUE){
//print the matches word
}
fclose($handle);
你帮我吗? :(

1 个答案:

答案 0 :(得分:2)

根据你的最终目标,你甚至可能不需要regexp,因为你想匹配整个单词而没有可变部分。

如果你想在关键字上设置一个循环,那么简单的str_replace()就可以通过强调一个替换单词,或简单if (strpos($input0, $word) !== false)来检查是否在句子中找到并查找位置

但是如果你想避免循环,那么可以获得更快的结果,特别是如果你有很多单词preg_match_all(),你可以按照Zanderwar的说法做你需要的。 这是一个例子:

$input0= "I am happy but sometimes quite pretty sad. It depends but I prefer to be happy in general.\nMy paragraph also continue on multilines\nend it makes me laugh and rejoy. I am so happy. HAPPY?";
// $contents = file_get_contents('words.txt');
$contents = "happy\nsad\nlaugh";

$words_list = str_replace("\n", '|', $contents);

if (preg_match_all("~($words_list)~si", $input0, $matches))
{
    print_r(array($matches));
    // Do what you want
}

如果需要,i标志匹配不区分大小写。

多行内容上的s标记匹配。

[编辑]在regexp上添加更多细节

在模式中你需要一个可以是~的分隔符,因为它很少用在句子和字符串中,所以当你使用/时你不需要逃避/分隔符。

如果你想捕捉这些词,我也会像~(sad|joy|happy)~一样加入你的话。如果您不需要像(?:sad|joy|happy)

这样的群组

|表示或。

如果你不需要捕获,你可以尝试用~($words_list)~si替换正则表达式~(?:$words_list)~si - 而且你不会 - 你将在$ matches数组中只有一个级别的捕获,位置[0]它始终是完全匹配。但是在这里你没有更复杂的模式可以匹配,所以不需要捕获