php读取文件替换第一个和第二个不同的东西

时间:2015-04-26 23:16:47

标签: php

我正在逐行阅读文件。

有些行会有-b-Bar Foo-b--h-Foo Bar-h-。 我希望能够替换第一次出现,例如-b-将替换为<b>,第二次出现将替换为</b>

这是我目前阅读文件的代码:

$handle = fopen($postDir, "r");
if ($handle) {
    while (($line = fgets($handle)) !== false) {

                      //<-- replace and checking goes here?

        echo '<p class="content">' .$line. '</p>';
    }
    fclose($handle);
} else {
    echo '<h1 class="alert fade">Unable to read Article</h1>';
};

我正在使用的标签:

    {li> -b- <b></b> {li> -i- <i></i> {li> -u- <u></u> {li> -h- <h1></h1>

这是否可行,检查每个标签并以不同方式替换第一/第二次出现?

3 个答案:

答案 0 :(得分:0)

您可以使用:

$line = <<< LOB
test -b- 123 -b- another test -h- hi there -h-
LOB;

$line = preg_replace('/-(b|i|u|h)-(.*?)-(b|i|u|h)-/sim', '<$1>$2</$3>', $line);

echo $line;

输出:

test <b> 123 </b> another test <h> hi there </h>

样本

http://ideone.com/LdcMbO

答案 1 :(得分:0)

这应该适合你:

这里我首先将您的文件放入一个file()的数组中,其中每一行都是一个数组元素。在那里,我忽略了新的行字符并跳过空行。

在此之后,我使用preg_replace_callback()检查每一行,检查它是否与模式匹配。如果是,我替换标签并将其退回。

<?php

    $lines = file("test.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

    $lines = preg_replace_callback("/-(b|i|u|h)-(.*?)-(b|i|u|h)-/i", function($m){
        if($m[1] == "h" && $m[3] == "h")
            return "<" . $m[1] . "1>" . $m[2] . "<" . $m[1] . "1>";
        return "<" . $m[1] . ">" . $m[2] . "<" . $m[1] . ">";
    }, $lines);

    print_r($lines);

?>

如果您想要保存文件,请使用file_put_contents(),如下所示:

file_put_contents("test.txt", array_map(function($v){return $v . PHP_EOL;}, $lines));

答案 2 :(得分:-1)

对于-b--i--u-,您可以使用此行

$line = preg_replace("/-([biu])-(.*)-([biu])-/iU", "<$1>$2</$3>", $line);

对于-h-,您可以使用以下内容:

$line = preg_replace("/-h-(.*)-h-/iU", "<h1>$1</h1>", $line);

更新:在Pedro发表评论后添加了ungreedy修饰符。

更新2 :在@ l&#39; L&#39; l

的有用评论后,从字符类中删除了|