2011-07-25 32 views
1

我舉一個例子來輕鬆地描述問題。在PHP中需要正則表達式的幫助,找出類似的詞

輸入文本:
魯尼是英語足球運動員誰扮演作爲曼聯前鋒。 魯尼成爲英格蘭隊最年輕的球員,當時他贏得了對抗澳大利亞友誼賽的第一個蓋帽。沃爾科特在2006年5月爆發魯尼的出場紀錄由36天

輸入關鍵字:魯尼

預期輸出(關鍵字數):3(魯尼,魯尼,魯尼的)

所以,它不僅包括「wayne rooney」,還包括其他類似的詞。

我有搜索過,我得到這個正則表達式:

$keyword_count = preg_match_all("/(\w*(?:wayne|rooney)\w*)/i", $source, $res); 

但它給了我4作爲輸出。它將「wayne rooney」視爲兩個不同的關鍵字。

任何人都可以幫助我構建正確的公式嗎? Regex真的是最有效的解決方案嗎?我有大量的文字要搜索。任何其他解決方案,例如PHP的文本挖掘庫?

非常感謝。

+1

由於您在搜索(|字符)中查找'wayne'或'rooney',因此會返回「額外」結果。嘗試通過替換'wayne |'部分有像'(wayne \ s *)?'之類的東西。 –

+0

是啊...它現在有效。非常感謝。 –

回答

1

試試這個正則表達式:

(?i)(\b(?:wayne(?:'s)?\s*)?rooney(?:'s)?\b) 

如果有限的普通規則計數來解析字符串,正則表達式是合適的解決你的問題。在一般情況下,你應該使用其他方法(可能是幾個正則表達式)。

+0

更好地詢問OP是否需要「Wayne」。如果是這樣,您的解決方案需要一個簡單的編輯。 :) –

+0

@射線,我更新了我的答案。 –

+0

感謝分享,但是這個正則表達式對我來說已經足夠了:'/(\ w *(?:(wayne \ s *)?rooney)\ w *)/ i' –

0

對於這種特殊的情況下,你可以做這樣的事情

Wayne(?:\sRooney[\w']*)?|Rooney[\w']* 

看到它here on Regexr

它說:搜索Wayne RooneyRooney(每個可以後跟[\w']*),但對於第一部分(?:\sRooney[\w']*)?是可選的。

+0

謝謝,我從@Uphill_發現了這個正則表達式。'1也有效:'/(\ w *(?:(wayne \ s *)?rooney)\ w *)/ i' –

0

你是簡單地試圖從一段文字中匹配一個已知的名字,還是實際上試圖找出與「已知人物」或「名稱」匹配的東西?

如果是後者,那麼你可以使用類似OpenCalais的東西約束一個已知類型的「人」(誰知道,也許有一個'足球運動員'分類學)。這個是analysis of similar工具。

+0

給出一個可能是關鍵字一個着名的名字,我需要指出它是在給定的文本中出現的。感謝您指點我的分析工具。他們看起來很有希望,我需要嘗試一下。 –