2011-11-24 106 views
7

我正在尋找一種方法來提取搜索中給定字詞任一側的X個字符。提取字符串中給定搜索字符串周圍的X個字符

例如,如果用戶輸入「inmate」作爲搜索詞,並且MySQL查詢找到帖子內容中包含「inmate」的帖子,我想返回不是帖子的全部內容,但是隻要在它的兩邊放上幾個單詞就可以讓用戶看到帖子的主旨,然後他們可以決定是否要繼續閱讀帖子並全部閱讀。

我正在使用PHP。

謝謝!

+0

這也可以幫助你:http://stackoverflow.com/q/1436582/1066234 –

回答

8

你可能無法用正則表達式完全解決這個問題。還有的詞與詞之間的其他字符可能性太多......

不過你可以試試這個正則表達式:

((?:\S+\s*){0,5}\S*inmate\S*(?:\s*\S+){0,5}) 

在這裏看到:rubular

你也可能要排除某些字符,因爲他們不算作單詞。現在,正則表達式計算任何由空格包圍的非空格字符序列作爲單詞。

僅匹配真實的話:

((?:\w+\s*){0,5}<search word>(?:\s*\w+){0,5}) 

但這裏任何非單詞字符(「等),剎車匹配

所以,你可以去...

((?:[\w"',.-]+\s*){0,5}["',.-]?<search word>["',.-]?(?:\s*[\w"',.-]+){0,5}) 

這也會匹配5個單詞,並在搜索詞的前後加上「',.-之一。

在PHP中使用它:

$sourcestring="For example, if a user enters \"inmate\" as a search word and the MySQL"; 
preg_match_all('/(?:\S+\s*){0,5}\S*inmate\S*(?:\s*\S+){0,5}/s',$sourcestring,$matches); 
echo $matches[0][0]; // you might have more matches, they will be in $matches[0][x] 
+0

爲了增加morja的答案,可以使用PHP的preg_match從MySQL中選擇字符串:http://php.net/manual/en/function.preg-match.php。 – bozdoz

+0

謝謝,今天晚些時候我有機會的時候我會試一試。我很欣賞你們已經採取回答這個問題的時間了! –

+0

我試過了,它有時候在Rubular上工作...嗯...我試圖在PHP中實現它,我似乎無法將我的頭包裹在它周圍...任何人都可以指向正確的方向嗎? –

1

我會用這個正則表達式PHP這也需要UTF8字符考慮

'~(?:[\p{L}\p{N}\']+[^\p{L}\p{N}\']+){0,5}<search word>(?:[^\p{L}\p{N}\']+[\p{L}\p{N}\']+){0,5}~u' 

在這種情況下「〜」是定界符變質'u'結尾標識正則表達式是UTF8解釋的。

請參閱有關Unicode的正則表達式標識文檔瀏覽:

http://www.regular-expressions.info/refunicode.html