2016-06-24 2 views
0

Я хочу заменить первое появление строки в файле. Так, например, я хочу найти «@base» в файле и заменить его на «@base: 20;». Я нашел этот: how to replace a particular line in a text file using php?, однако это заменяет все вхождения найденной строки, и я хочу только первую.Заменить первую строку соответствия в строке php

У кого-нибудь есть идеи?

Мой файл выглядит следующим образом:

@base: 24px; 
@border-color: #B2B; 

.underline { border-bottom: 1px solid green } 

#header { 
    color: black; 
    border: 1px solid @border-color + #222222; 

    .navigation { 
    font-size: @base/2; 
    a { 
    .underline; 
    } 
    } 
    .logo { 
    width: 300px; 
    :hover { text-decoration: none } 
    } 
} 

Я хочу заменить всю строку, где первым вхождение @BASE в Я хочу, чтобы заменить его. @BASE: 50px; ". Таким образом, результат будет выглядеть так:

@base: 50px; 
@border-color: #B2B; 

.underline { border-bottom: 1px solid green } 

#header { 
    color: black; 
    border: 1px solid @border-color + #222222; 

    .navigation { 
    font-size: @base/2; 
    a { 
    .underline; 
    } 
    } 
    .logo { 
    width: 300px; 
    :hover { text-decoration: none } 
    } 
} 

Пиксели после @BASE могут быть разные, так вот почему я не могу найти всю строку и заменить это.

+1

обновите свой вопрос, чтобы включить образец вашего файла, ожидаемый результат и в идеале, что вы уже пробовали –

+0

Я обновил свой вопрос. –

+0

Где вы застряли? Это похоже на тривиальную задачу. – Eiko

ответ

0

Вы можете выполнить это с помощью preg_match и preg_replace.

Начните с чтения файла в массив, перемещайте массив и найдите линию, которая соответствует тому, что вам нужно заменить.
Затем измените линию и разломите петлю, чтобы было изменено только первое вхождение.
Наконец, напишите строки обратно в файл.

<?php 

$lines = file('file.css'); 

// note that $line is used as a reference 
// so we can modify the existing array 

foreach ($lines as &$line){ 

    $isMatch = preg_match('#base:\s(\d+)px;#',$line); 

    if ($isMatch){ 

     $line = preg_replace('#\d+#','50',$line); 
     break; 

    } 

} 

file_put_contents('file.css',implode('',$lines)); 

preg_match будет проверять каждую строку до тех пор, пока шаблон не будет найден.
Мы ищем линию со строкой база: [цифры] px;.

Если совпадение найдено, мы изменить линию, используя preg_replace заменяя картину [цифры] со значением и break цикла, так что никаких дальнейших изменений не сделаны.

И, наконец, implode измененный массив в строку с использованием ничего в качестве разделителя и напишите содержимое обратно к файлу.

+0

Спасибо, это сработало! –

+0

Добро пожаловать! –

0

Вы можете попробовать что-то вроде этого.

$content = file("yourfilepath"); 
for($i = 0; $i < count($content); $i++) { 
    if (strpos($content[$i], "@base") !== false) { 
     $content[$i] = "@base:20;\n" 
     break; 
    } 
} 
file_put_contents(implode(PHP_EOL, $content)); 

Я надеюсь, что это сработает.

Смежные вопросы