我有一個(php5.2和5.3)正則表達式,需要從用戶帖子(可能包括電子郵件地址和超鏈接)中提取第一個$ x句子,並且無法找出原因是的,這是一個醜陋的正則表達式,我將優化它時,它的工作原理):PHP preg_match組重複
/^(([^.!?]+|(\w+[[email protected]?&=%:])+\w+)+[.!?]+\s){0,4}/
返回前四句,但
/^(([^.!?]+|(\w+[[email protected]?&=%:])+\w+)+[.!?]+\s){0,5}/
沒有返回比賽。我的理解是{0,5}應該與之前的組匹配0到5次,並且如果它只能匹配4次,它應該仍然有效。
任何人都可以闡明這種行爲?
更新:$ x只是一個任意數字;在正則表達式中使用{0,$ x}。帖子被過濾爲由單個空格分隔的句子。對不起,這個醜陋的表情......已經看了幾天,現在正在我的腦海中......做出了由sawa建議的更改。我的主要問題是關於行爲,小組匹配的內容不應該太重要。
UPDATE2:這基本上是我在做什麼:
function extractSummary($message, $limit) {
$expr = '/^(([^.!?]+|(\w+[[email protected]?&=%:])+\w+)+[.!?]+\s){0,'.$limit.'}/';
$msg = preg_replace('/[\x00-\x1f\x80-\xff]/', "\n" strip_tags($message));
$msg = trim(preg_replace('/(\n|\s| )+/', ' ', $msg)).' ';
preg_match($expr, $msg, $summary);
return $summary[0];
}
一個句子(在我的腦海至少,沒有進入NLP領土,COS站點它只是一個函數)是什麼都漲到句點,感嘆號或問號,但時段可以出現在URL的電子郵件地址的句子中。這個正則表達式的最後一個版本只計算了5個時間段,因此打破了鏈接和電子郵件地址。
更新3:回想一下,我剛剛添加了更可怕的代碼,我會解釋最後一個。發現某些發佈的內容具有非打印字符(如\ r等),但與正則表達式無法很好地配合使用,所以我刪除了第一個preg_replace的非打印字符。第二個用一個空格代替任何進一步的空白組,所以這些句子有希望被一個空格分開。
什麼是$ x句子?帖子是怎麼樣的? – sidyll 2011-03-29 01:36:41
在這之前,你應該清理你的正則表達式。例如,你不需要最外面的一對圓括號' ((\ w + [.... \ w)'),並且你對捕獲不一致:有時你有'(...)',而有時候你有'(?:...)'。只有當你想提取那部分時,我認爲發佈一個複雜的正則表達式並且讓人們遵循它是不禮貌的 – sawa 2011-03-29 01:39:29
謝謝你的建議,但我認爲一些例子句是必要的,或者至少你應該告訴我們你認爲這是一個句子,句子只是一段時間的序列嗎?從你所擁有的東西推測出來,這可能不是這種情況。句子只有在它是電子郵件地址的一部分時才允許在句子中使用?什麼 是定義一個句子的條件? – sawa 2011-03-29 02:01:31