我正在尝试在文本中搜索指定值,如果找到,则用连字符将其连接到上一行。
这是我的代码
$text = "ABC01
ABC02
ABC03
ABC04
ABC05
ABC06
";
$text = explode("\n",str_replace("\r", "", $text));
$text = array_filter($text, 'trim');
$previous = "";
foreach ($text as $line) {
if ($line == 'ABC04') {
echo $previous." - ".$line;
echo '<br>';
}
else{
echo $line;echo '<br>';
}
$previous = $line;
}
结果是
ABC01
ABC02
ABC03
ABC03 - ABC04
ABC05
ABC06
但是 ABC03 在第三行
我想要这个结果
ABC01
ABC02
ABC03 - ABC04
ABC05
ABC06
也许这是一个解决方案?
我使用 array_search 来查找值键。
我将该值添加到之前的值中。
然后我取消设置找到的键并爆炸数组。
$text = "ABC01
ABC02
ABC03
ABC04
ABC05
ABC06";
$text = explode("\n",str_replace("\r", "", $text));
$text = array_filter($text, 'trim');
$key = array_search("ABC04", $text);
$text[$key-1] .= " - " . $text[$key];
Unset($text[$key]);
Echo implode("<br>\n", $text);
编辑;我发现缩进代码在 3v4l 中引起了问题。 将链接替换为不缩进
这个也有效。很简单
foreach ($text as $line) {
if ($line == 'ABC03') {
echo $line.' - ';
} else {
echo $line.'<br>';
}
}
这是一个有效的 foreach。但我不清楚你到底想做什么。
foreach ($text as $line) {
if ($line == 'ABC03') {
echo $line.' - ';
}
else{
echo $line;
echo '<br>';
}
if ($line != 'ABC04')
$previous = $line;
}
}
对我来说,当他搜索的值没有前一个元素时,遇到了一个明显的问题——因此不需要使用连字符连接。
因为此任务只需要文本中的一行将其前面的换行符替换为空格-连字符-空格,所以这个 XY Problem 最直接地通过单独的
preg_replace()
调用来解决。抛弃所有其他笨拙的处理和循环。
\R+
将匹配一个或多个换行符序列。(?=...)
是前瞻——确保找到所寻找的文字字符代码:(演示)
echo preg_replace(
'/\R+(?=ABC04)/',
' - ',
trim($text)
);