【问题标题】:Checking if sentence contains a word in PHP检查句子是否包含PHP中的单词
【发布时间】:2012-09-20 11:22:43
【问题描述】:

如何检查一个句子是否包含一个单词。我明确地使用名称句子和单词而不是字符串和子字符串。例如: 对于句子

$s = "Ala makota, a kot ma przesrane";

调用函数

checkIfContains("kota",$s) 

返回 false。

但是对于

checkIfContains("makota",$s) 

返回真。

【问题讨论】:

  • 请阅读strpos或更好的php手册,阅读名为String functions的整章
  • @VladBalmos 这不仅仅是关于字符串是否只包含子字符串

标签: php


【解决方案1】:

如果您只想匹配完整的单词,则需要一个正则表达式来完成此操作。请尝试以下操作:

<?php
function checkIfContains( $needle, $haystack ) {
    return preg_match( '#\b' . preg_quote( $needle, '#' ) . '\b#i', $haystack ) !== 0;
}

【讨论】:

  • 谢谢@BerryLangerak,它可以工作:) 但是你忘记了 preg_match 函数的第二个参数 $haystack
  • @Martin 所以我做到了。好吧,无法测试您发布的所有内容;)
  • 注意:默认分隔符字符是 '/' 而不是 '#'。只需将 '#' 替换为 '/' 即可使此示例正常运行。
  • @AdrianMaire 有点晚了,但这里是:是的,“正常”分隔符是“/”。然而,在网络环境中,我发现这非常很麻烦,所以我开始寻找更好的。我最终以“~”结尾,因为它并没有被大量使用。无论如何,该示例对#/ 均有效。 :)
【解决方案2】:

你需要strpos

if (strpos($s, 'kota') !== false) { 

}

或者如果你坚持..

function checkIfContains($needle, $haystack) {
    return (strpos($haystack, $needle) !== false);
}

对于完整的单词,您可以考虑正则表达式:

if (preg_match('/\bkota\b/i', $s)) { }

【讨论】:

  • 其实不是,他是在找full个词,也就是说strpos不够用。
  • checkIfContains("Ala makota" "kota") 应该是假的,根据他的问题。您的函数将返回 true。
【解决方案3】:

我会使用explode根据字符(在本例中为“”)将字符串分成一个数组。

function checkIfContains($toTest, $toCheck)
{
    // Check if length of either string is zero for validation purposes
    if(strlen($toTest) == 0 || strlen($toCheck) == 0)
    {
        return false;
    }
    $exploded = explode(" ", $toCheck);
    foreach($exploded as $word)
    {
         if($word == $toTest)
         {
              // Found a match, return true!
              return true;
         }
    }
    // None matched, return false
    return false;
}

【讨论】:

  • 如果句子是“foo bar kota”怎么办。仍然包含“kota”作为一个词,但因为您的脚本看到“kota”。相反,它不起作用。这就是为什么我选择在正则表达式中使用\b(单词边界)。
  • 另外,您可以使用in_array( $word, $exploded ) 代替较慢的foreach。所以:$exploded = explode( " ", $toCheck ); return in_array( $toTest, $exploded );
  • 第一条评论:好点,虽然我很好奇您是否想查找中间有非单词字符的单词(例如“8:00”)第二条评论:我可以(并且 in_array 肯定更快)。我扩展它的原因是为了让正在发生的事情更清楚,假设提问者相对较新。
  • checkIfContains("8:00", "I woke up at 8:00") === true &amp;&amp; checkIfContains("8:00", "I woke up at 18:00") === false,这正是提问者所问的。 :)
【解决方案4】:

你可以试试:

function checkIfContains($needle, $haystack) {
    // Remove punctuation marks
    $haystack = preg_replace('/[^a-zA-Z 0-9]+/', '', $haystack);
    // Explode sentence with space
    $haystack = explode(' ', $haystack);
    // Check if $needle exist
    return in_array($needle, $haystack);
}

【讨论】:

    【解决方案5】:
    $string = "Ala makota, a kot ma przesrane";
    
    checkIfInString("makota", $string);
    
    function checkIfInString($needle, $haystack) {
        $delimiters = ' ,.';
        return in_array($needle, explode($haystack, $delimiters);
    }
    

    【讨论】:

      【解决方案6】:

      你可以试试:

      if(strpos($s,"kota") !== false){
             echo true;
      }
      

      或:

      function checkIfContains($string, $letter){
             return strpos($string, $letter) !== false;
      }
      

      【讨论】:

        猜你喜欢
        • 2018-04-21
        • 2020-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多