2011-10-28 50 views
3

我需要找到圍繞字符串的一個或多個句子。這將從第一個大寫字母或中斷線到終點或中斷線。從第一個大寫字母到查詢字符串的句尾匹配的正則表達式

我這是什麼,但當然是不工作:

$search_string='example'; 

$regex = '\[A-Z]{1}[a-z]*\s*'.$search_string.'\s*[a-zA-Z]*\i'; 

preg_match_all($regex, $content, $matches); 

如果這個詞在超過上一句,我將需要獲取兩個句子重複。我不確定是否即時解釋;請評論,我會嘗試再次解釋。


編輯

我有一個WordPress的網站,很多職位和PDF格式,文檔等這些門柱內側的。我使用稱爲swish-e的搜索引擎來索引所有內容並顯示結果。 當有人搜索任何字符串時,我想顯示該字符串的摘要而不是完整的帖子/或pdf。

因此,如果用戶搜索「示例」字符串,我需要顯示所有句子或至少其中幾個單詞的例子出現。 這就是爲什麼我要求在開始時使用大寫字母並在結尾處要求結束點。我知道這不會是完美的,但至少我需要支付某些情況下(大寫字母/分斷線等)

希望它更加清晰,再次感謝很多

+0

沒有真正清楚自己想要什麼 - 但是,你可以使用使用分組(http://www.regular-expressions.info/brackets.html) – mozillanerd

+0

礦和當正文中存在專有名詞時,所有其他答案都會失敗。請告知這是否會成爲問題。 –

+0

我的不會。 ;-) – MrTrick

回答

1

你search_string的應preg_quote'd,或者用戶可以操縱的結果像|的特殊字符

$search_string='example'; 
$regex = '/[A-Z][a-z ]*\b'.preg_quote($search_string,"/").'\b.*?(?:[.!?]|$)/i'; 
preg_match_all($regex, $content, $matches); 

我假定句子可以被終止。要麼 ?要麼 !

您可能不希望爲模式分隔符使用\字符 - 如果它可以工作,它可能會給出奇怪的行爲。你還可以將i模式修飾符應用於你的模式,因此[a-z]也將匹配大寫字母,[A-Z]將匹配小寫字母。

編輯:

該解決方案更加靈活,但它不需要句子開始一個大寫字母。你,如果你想使用它:

$search_string='example'; 
$regex = '/[^.!?\n]*\b'.preg_quote($search_string,"/").'\b[^.!?\n]*/i'; 
preg_match_all($regex, $content, $matches); 
+0

我的快速測試與您的第二個解決方案相得益彰。非常感謝 – chifliiiii

1

如何:

$search=preg_quote('example'); 

$regex = '/[A-Z][^\.]+\s+'.$search.'\s[^\.]+/i'; 

preg_match_all($regex, $content, $matches); 

基本上是:

  • 大寫字母
  • 一個或多個的任何不是一個.
  • 一個或多個空格
  • 您的模式
  • 一個或多個不是點的東西。

應符合句子排除後.


這是(檢查和工作)處理「到下一行」的問題,以及包圍的話更加完整的解決方案報價:

$content = "Sentence one. This is an example sentence. Sentence two. Sentence with the word 'example' in it\nthat goes over multiple lines. this isn't starting with a capital letter, for example."; 
$search=preg_quote('example'); 
$regex = '/[A-Z][^\.\n]+\W'.$search.'\W[^\.\n]+/'; 

preg_match_all($regex, $content, $matches); 
print_r($matches); 

打印:

Array 
(
    [0] => Array 
     (
      [0] => This is an example sentence 
      [1] => Sentence with the word 'example' in it 
     ) 
) 
+0

當搜索詞在其之前或之後有一個句號(或其他句子結束符)時,它當前會中斷,因爲它匹配\ W –

+0

True ...如果\ W字符實際上是\ b然後它會更好地工作,因爲'\ b'是零長度的,不會'吃'''。 – MrTrick

1

此正則表達式會做你想要什麼:

$regex = '/[A-Z\n]{1}([a-z]*?\s*)+'.$search_string.'(\s*?[a-zA-Z]*)+[\.\n]/'; 

,在這裏你可以看到它是如何工作的:

http://ideone.com/aCJJZ

相關問題