php从字符串范围中删除多余的单词

时间:2013-09-17 10:31:07

标签: php string

我有一系列信息。例如:

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

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

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

如果输入是

,则为或

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

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

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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页;

-

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

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

-

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

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