如何使用正则表达式来确定分隔符之间的最大块


How can I use RegEx to determine the largest chunk between delimiters?

RegEx 使用指定的分隔符确定短语的最长"部分"?

新闻报道几乎总是有这种结构,其中实际上是标题加上一堆垃圾。有没有办法清除所有垃圾并保持标题的最长部分,显然这需要使用分隔符,例如|-:等......

以下是一些示例

eBand | Jornalismo | Saúde | Alimentos em conserva podem causar botulismo; saiba como evitar a doença

奥巴马呼吁在埃尔帕索进行广泛的移民改革 - 圣何塞水星新闻

CL + Suspensa produção de mortadela com toucinho, suspeita de contaminação

BBC新闻-约翰克里将在紧张的关系中前往巴基斯坦

我认为

不是正则表达式本身。但是您可以拆分"垃圾"字符上的标题,然后按其余部分的长度排序。

$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 标志)。

我认为这不能在纯正则表达式中完成,但您可以使用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');