2011-05-11 58 views
2

RegEx用確定的分隔符來確定短語中最長的「部分」?如何使用RegEx確定分隔符之間最大的塊?

新聞報道幾乎總是有這樣的結構,其中實際上是標題加上一堆垃圾。有沒有一種方法,以正則表達式的所有垃圾,保持標題的最長的部分,顯然這將需要使用的分隔符,如|-:等..

下面是一些例子

eBand | Jornalismo |Saúde| Alimentos em conserva podem causar botulismo; saiba科莫evitar一個doença

奧巴馬在埃爾帕索要求大範圍的移民改革-聖何塞水星報

CL +連翹produção德意式肉腸COM toucinho,suspeita德contaminação

BBC新聞-約翰·克里前往巴基斯坦緊張的關係

回答

4

不與我認爲的正則表達式本身。但是你可以將標題分成「垃圾」字符,然後按照剩餘部分的長度進行排序。

$parts = preg_split('#\s*[-|:+]+\s*#', $title); 
$parts = array_combine($parts, array_map("strlen", $parts)); 
arsort($parts); 
$longest = current(array_keys($parts)); 

而是特定的分隔符,你也可以拆分非字符號\W(或[^\pL]與/ U Unicode的標誌)。

+0

這是一個可怕的好真棒回答。我很驚訝於在這麼幾行中完成的操作。做得好! –

0

我不認爲它可以在純正則表達式來做到,但你可以使用使preg_split和遍歷結果:

$pieces = preg_split('/[|-:]/', $headline, PREG_SPLIT_NO_EMPTY); 
$max_len = 0; 
$result = ''; 
foreach ($pieces as $piece) { 
    $len = strlen($piece); 
    if ($len > $max_len) { 
     $max_len = $len; 
     $result = $piece; 
    } 
} 

或者使用array_reduce

function longest($v, $w) { 
    if (strlen($w) > strlen($v)) { 
     return $w; 
    } 
    return $v; 
} 

$pieces = preg_split('/[|-:]/', $headline, PREG_SPLIT_NO_EMPTY); 
$result = array_reduce($pieces, 'longest'); 
相關問題