2011-10-12 46 views
4

您好我想創建一個正則表達式,將做以下PHP正則表達式圍繞搜索短語

搶搜索短語前5個字的字集(或x如果只有X字有)和5從(當我說的話我的意思的單詞或數字無論是在文本塊)的文本塊

歡迎搜索短語後的單詞(或x如果只有X字有)堆棧溢出!訪問您的用戶頁面以設置您的姓名和電子郵件。

如果您要搜索「訪問」它將返回: 歡迎來到堆棧溢出!訪問你的用戶頁面設置

這個想法是在php中使用preg_match_all給我一堆搜索結果,顯示文本中搜索短語出現在搜索短語的每次出現的位置。

在此先感謝:d

在子記有可能是一個更好的辦法讓我的結果,如果你覺得有請隨意扔在游泳池因爲我不知道這是我認爲,最好的只是第一種方式做我需要:d

回答

8

如何:

(\S+\s+){0,5}\S*\bvisit\b\S*(\s+\S+){0,5} 

將匹配五「詞」前後,你的搜索詞(但接受更少,如果文字是短)(在這種情況下visit)。

preg_match_all(
    '/(\S+\s+){0,5} # Match five (or less) "words" 
    \S*    # Match (if present) punctuation before the search term 
    \b    # Assert position at the start of a word 
    visit   # Match the search term 
    \b    # Assert position at the end of a word 
    \S*    # Match (if present) punctuation after the search term 
    (\s+\S+){0,5} # Match five (or less) "words" 
    /ix', 
    $subject, $result, PREG_PATTERN_ORDER); 
$result = $result[0]; 

我將「單詞」定義爲由至少一個空格分隔的非空白字符序列。

搜索詞應該是實際詞(以字母數字字符開頭和結尾)。

+0

+1使用真正的正則表達式。但是你不需要\ S * \ b的東西。假設你的搜索詞是$關鍵字,'/(\ S + \ s +){0,5}'。 $關鍵字。 '(\ s + \ S +){0,5} /'工作得很好。 – Peter

+0

這個示例文本中不需要它。但是,如果關鍵字可能被除了空白以外的東西所包圍,則需要它。假設關鍵字是'Overflow',那麼你需要'(\ S + \ s +){0,5} \ S * \ boverflow \ b \ S *(\ s + \ S +){0,5}'或者你贏了'不會得到一場比賽。 –

+0

謝謝你,我完成的代碼.' <?php $ preg_safe = str_replace(「」,「\ s」,preg_quote($ search)); ($ s \ S +){0,8}/ix「; if(preg_match_all($ pattern,$ row ['news_text'],$ matches)){ $ row ['extract'] = str_replace(strtolower($ search),「「,strtolower($ matches [0] [0])); } else { $ row ['extract'] = false; }?> –

1

你可以做如下因素(這是一個有點沉重的計算,所以它woudn't很長的字符串是有效的):

<?php 
$phrase = "Welcome to Stack Overflow! Visit your user page to set your name and email."; 
$keyword = "Visit"; 
$lcWords = preg_split("/\s/", strtolower($phrase)); 
$words = preg_split("/\s/", $phrase); 
$wordCount = 5; 

$position = array_search(strtolower($keyword), $lcWords); 
$indexBegin = max(array($position - $wordCount, 0)); 
$len = min(array(count($words), $position - $indexBegin + $wordCount + 1)); 
echo join(" ", array_slice($words, $indexBegin, $len)); 
//prints: Welcome to Stack Overflow! Visit your user page to set 

Codepad example here