2

我有一系列信息。例如:

第 1 卷第 3 章第 5 页至第 1 卷第 5 章第 10 页

删除冗余信息并将其转换为的最快方法是什么:

第 1 卷第 3 章第 5 页至第 5 章第 10 页

或者如果输入是

第1卷第3页第5页到第1章第3页第10页然后输出

第 1 卷第 3 章第 5 页至第 10 页

4

2 回答 2

2

这里最困难的部分是将输入拆分为标记,因为它的结构不够好。我使用递归函数来顺序清理第一个元素重复的字符串。它适用于这个输入,但我不确定它是否 100% 正确,因为输入结构不清楚:

<?php
$str = 'Volume 1 Chapter 3 Page 5 TO Volume 1 Chapter 3 Page 10';
$str = clear_first_element_duplicates($str);
var_dump($str);

function clear_first_element_duplicates($str)
{
    if (preg_match('/(.*?\d)\s(.*)/', $str, $tokens))
    {
        $regexp = preg_quote($tokens[1]);
        $str = preg_replace("/$regexp\s?/", '', $tokens[2]);
        return $tokens[1]." ".clear_first_element_duplicates($str);
    }

    return $str;
}

印刷:

"Volume 1 Chapter 3 Page 5 TO Page 10"
于 2013-09-17T10:57:40.330 回答
0

我的脚本看起来很复杂但值得:

我添加了可变级别,因此它不仅限于卷、章和页,您可以根据需要添加例如段落行和字符,甚至可以更改措辞。见最后的例子。

** 注意 $separator 参数,它必须是 Exact(区分大小写)并且可能只在脚本中出现一次,这很容易修复,但我专注于函数的重要部分 **

function redundancy($string, $separator){
    list($a, $b) = explode($separator, $string);

    //getting the numeric values of both sides
    $pattern = '/[0-9]+/';
    preg_match_all($pattern, $a, $a_values);
    preg_match_all($pattern, $b, $b_values);

    $a_values = $a_values[0];
    $b_values = $b_values[0];

    //getting the wording and cleaning out the numbers, I guess this can be improved through a better REGEX
    preg_match_all('/\b\w+\b/', $a, $matches);
    foreach($matches[0] as $match){
        if(!is_numeric($match)) $words[] = $match;
    }

    //algorithm
    $length = count($a_values) - 1; // excluding the last element, to be checked separately
    $output = $a.$separator." ";
    $same_full_path = true; // check if the levels has been altered to check the last element
    $same_parent = true; // check the previous level
    for($i = 0; $i < $length; $i++){
        if($a_values[$i] !== $b_values[$i] || $same_parent === false){
            $same_parent = false;
            $same_full_path = false;
            $output .= $words[$i]." ".$b_values[$i]." ";
        }
    }

    //adding the word to the last element or not, The last element check must be outside the loop because it's special;
    if($same_full_path === false || end($a_values) === end($b_values)) $output .= end($words)." ";
    $output .= end($b_values);

    echo "$string <Br/> $output; <br/><br/> ";
}

redundancy('Volume 1 Chapter 3 Page 5 TO Volume 1 Chapter 5 Page 10', 'TO');
redundancy('Serie 1 Season 2 Chapter 2 Minute 5 Second 6 Until Serie 1 Season 3 Chapter 4 Minute 3 Second 1', 'Until');
redundancy('District 4 Building 2 Floor 4 Door 5 To District 4 Building 2 Floor 4 Door 8', 'To');

输出:

第 1 卷第 3 章第 5 页至第 1 卷第 5 章第 10 页

第 1 卷第 3 章第 5 页至第 5 章第 10 页;

-

意甲第 2 章第 2 分 5 秒 6 直到第 1 季第 3 章第 4 分 3 秒 1

意甲第 2 章第 2 分 5 秒 6 直到第 3 季第 4 分 3 秒 1;

-

4 区 2 楼 4 门 5 至 4 区 2 楼 4 门 8

4区4楼2楼4门5至8;

于 2013-09-17T11:51:11.873 回答