2011-11-10 18 views
5

例如存在的話,如果我的一句話是$sent = 'how are you';如果我使用strstr($sent, $key)搜索$key = 'ho'它將返回true因爲我的一句話中有ho如何檢查是否在一個句子

我正在尋找的是一種返回true的方法,如果我只搜索how,你或你。我怎樣才能做到這一點?

回答

6

如果您想爲您在同一個字符串多個單詞,你正在處理大的字符串,那麼這是更快:

$text = explode(' ',$text); 
$text = array_flip($text); 

然後你可以檢查的話與:

if (isset($text[$word])) doSomething(); 

這種方法閃電般快。

但爲了檢查短字符串中的幾個單詞,然後使用preg_match。

UPDATE:

如果你確實要使用此,我建議你實現它像這樣以避免出現問題:

$text = preg_replace('/[^a-z\s]/', '', strtolower($text)); 
$text = preg_split('/\s+/', $text, NULL, PREG_SPLIT_NO_EMPTY); 
$text = array_flip($text); 

$word = strtolower($word); 
if (isset($text[$word])) doSomething(); 

然後雙擊空格,換行,標點符號和首都贏得了」不會產生錯誤的否定。

這種方法在檢查大字符串(即文本的整個文檔)中的多個單詞時速度要快得多,但如果您只想查找單個單詞是否存在正常大小,則使用preg_match會更有效串。

+0

我試過了,它工作。非常感謝。 – Tafu

+0

如果您打算使用此功能,請參閱我的更新以使其更可靠。 – Alasdair

1

@ codaddict的答案是技術上是正確的,但如果你正在尋找由用戶提供的話,你需要轉義特殊的任何字符正則表達式在搜索詞中的含義。例如:

$searchWord = $_GET['search']; 
$searchWord = preg_quote($searchWord); 

if (preg_match("/\b$searchWord\b", $input) { 
    echo "$input has the word $searchWord"; 
} 
+0

雅,搜索到的單詞由用戶提供。感謝您的洞察力。 – Tafu

+0

**如果**缺少關閉括號。 –

3

你可以做的一件事是把你的句子按空格分解成一個數組。

首先,您需要刪除任何不需要的標點符號。 下面的代碼刪除任何不是字母,數字,或空間:

$sent = preg_replace("/[^a-zA-Z 0-9]+/", " ", $sent); 

現在,所有你是的話,用空格隔開。要創建一個按空間分割的陣列...

$sent_split = explode(" ", $sent); 

最後,您可以執行檢查。以下是所有步驟的組合。

// The information you give 
$sent = 'how are you'; 
$key = 'ho'; 

// Isolate only words and spaces 
$sent = preg_replace("/[^a-zA-Z 0-9]+/", " ", $sent); 
$sent_split = explode(" ", $sent); 

// Do the check 
if (in_array($key, $sent)) 
{ 
    echo "Word found"; 
} 
else 
{ 
    echo "Word not found"; 
} 

// Outputs: Word not found 
// because 'ho' isn't a word in 'how are you' 
0

隨着承認ABHI的回答,一對夫婦的建議:

  1. 我說/我的正則表達式,因爲句子,單詞可能不區分大小寫的
  2. 我加了明確的== = 1到基於所述記錄的preg_match返回比較值

    $needle = preg_quote($needle); 
    return preg_match("/\b$needle\b/i", $haystack) === 1; 
    
相關問題