2012-03-23 32 views
2

這裏是我的總結awesome字符串函數:如何使用preg_match_all在乾草堆中找到複數針?

function summarize($haystack, $needle, $wordLimit=1) { 
    $preg_safe = str_replace(" ", "\s", preg_quote($needle)); 
    $pattern = "/(\w*\S\s+){0,$wordLimit}\S*\b($preg_safe)\b\S*(\s\S+){0,$wordLimit}/ix"; 
    if (preg_match_all($pattern, $haystack, $matches)) { 
     return $matches[0][0]; 
    } 
    return false; 
} 

該功能會在大串針,並用針周圍背景的ň話一起返回。有點像谷歌搜索結果顯示搜索字符串在標題下的結果的上下文中。

下面是我如何使用它:

$haystack = 'Lorem ipsums dolor sit amet.'; // note the plural "ipsum" 

echo summarize($haystack,'ipsums'); 

返回:Lorem ipsums dolor(默認爲1個字針周圍)

echo summarize($haystack,'ipsum'); // i.e. not exact word match of "ipsums" 

返回:false

我怎樣才能調整正則表達式返回相同的結果確切的單詞匹配?

+0

什麼是「牛」的複數?是「牛」嗎?線索:不是。你打算如何處理? – 2012-03-23 19:21:42

+1

您可以通過複合功能始終運行輸入針。 Nethack有一個......有趣的一個:http://celabs.com/nethack/html/objnam_8c.html#ac1ac6c9f4a8707e6d675c75cf9bd4908 =) – Crontab 2012-03-23 19:25:55

+0

難道你不想只拿出'\ b',所以你不要'在搜索字符串旁邊需要單詞邊界嗎? – 2012-03-23 19:27:35

回答

0

那麼通過你的例子,你可以簡單地允許在單詞結尾處有一個可選的s。例如:

"/(\w*\S\s+){0,$wordLimit}\S*\b(${preg_safe}s?)\b\S*(\s\S+){0,$wordLimit}/ix" 

但這可能是不夠的。

相關問題