我有一系列信息。例如:
第1卷第3章第5页至第1卷第5章第10页
删除冗余信息并将其转换为以下内容的最快方法是什么:
第1卷第3章第5页至第5章第10页
如果输入是
,则为或第1卷第3章第5页至第1卷第3章第10页 然后输出
第1卷第3章第5页至第10页
答案 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号楼;