preg_match word并检查它是否存在于数组中

时间:2014-07-16 07:06:39

标签: php

我有一个字符串说

 $str =" I am engineer".
 $array_match =array('doctor','inspector','teacher');

找出字符串中给定的特定职业的正确方法是什么?在数组中存在或不使用正则表达式,我尝试过以下代码但没有得到结果,出了什么问题

<?php 
    $str =" I am engineer"
    $array_match =aaray('doctor','inspector','teacher');
    $flag=0;
    foreach($array_match as $match)
    {

        if(preg_match('~'.$match.'~',$str)== true)
        {
             $flag=1;
        }


    else
        {
             $flag=0;   
        }
    }
    if($flag==1)
    { 
        echo "word matched .";
    }
    else
    {
        echo "word not match ";
    }
?>

4 个答案:

答案 0 :(得分:1)

删除循环中的else并在找到匹配后添加一个中断。一旦设置好,就无需重置标志。另外,请使用strpos()stripos()代替preg_match。根据您的情况,不需要使用正则表达式。

$str = "I am engineer";
$array_match = array('doctor','inspector','teacher');

$flag = false; // Flag defaults to false

foreach($array_match as $word) {

    // Check if profession is in string
    if (stripos($str, $word) !== false) {

        // If profession is found, set flag to true and exit loop
        $flag = true;
        break;

    }
}

if ($flag) 
    echo 'Word matched';
else
    echo 'Word not matched';

答案 1 :(得分:1)

它现在无法正常工作的原因是,当找到匹配项时,您没有突破循环。这意味着如果你的第二个单词匹配,flag将为“1”,但循环将继续。然后,如果下一个单词不匹配,则标志将被重置为“0”,打印“单词不匹配”。

将第$flag = 1行改为这两行:

$flag = 1;
break;

它会起作用。

答案 2 :(得分:1)

有很多&#34;正确&#34;解决问题的方法,可能没有最好的&#34;方式(这将是一个意见问题)。

您可以进行搜索,求助于遍历您的专业阵列。您可以在您的职业数组上调用implode来生成单个正则表达式,然后您可以检查您的字符串以查看该正则表达式是否匹配。

例如,我们假设您从:

开始
$string = " I am engineer";
$professions = array('doctor','inspector','teacher');

您可以生成正则表达式(不要忘记开始和结束斜杠),如下所示:

$regexp = '/' . implode($professions, '|') . '/';
// yields: "/doctor|inspector|teacher/"

此正则表达式将匹配具有 doctor 检查员教师的字符串。

然后你可以拨打preg_match来查看你的字符串是否有任何匹配。如果是这样,它们将位于您的$matches数组中:

if (preg_match($regexp, $string, $matches)) {
  print "Found this profession: " . $matches[0] . "\n";
}

当你把它们放在一起时,你有这个:

$string = " I am engineer";
$professions = array('doctor','inspector','teacher');

$regexp = '/' . implode($professions, '|') . '/';

if (preg_match($regexp, $string, $matches)) {
  print "Found this profession: " . $matches[0] . "\n";
}
else {
  print "No matching profession found.\n";
}

这是一段稍短的代码,您不必担心循环使用您的各种专业。实际上,大部分工作都是在调用implodepreg_match时完成的。

顺便说一下,这个例子只是在测试字符串中查找专业的第一个匹配,并输出该专业。如果您的测试字符串有多个职业匹配,则需要调用preg_match_all并仔细查看$matches数组。我会为你做这个练习。

答案 3 :(得分:0)

您可以对array_filterstrstr

执行相同的操作
$string =" I am engineer";  
$array_match =array('doctor','inspector','teacher');

$result = count(array_filter($array_match, create_function('$arr','return strstr("'.$string.'", $arr);')))>0;

if($result)  
        echo "word matched";
else
        echo "not matched";