2015-04-26 35 views
0

我正在逐行讀取文件。php讀取文件替換第一個和第二個不同的東西

某些行將有類似-b-Bar Foo-b--h-Foo Bar-h-。 我希望能夠替換第一次出現如-b-將替換爲<b>第二次出現將被替換爲</b>

這裏是我當前的代碼讀取文件:

  • -b-<b></b>
  • -i-<i></i>
  • -u-用於<u></u>
  • :我使用

    $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>'; 
    }; 
    

    標籤

  • -h-<h1></h1>

這是可能的,檢查每個標籤和不同取代第一/第二次出現?

+3

只是爲了讓你知道你接受的答案包含一個正則表達式這是貪婪的,結果:' - b-東西-b-測試測試-b-另一個-b-'將是'東西-b-測試測試-b-另一個' - 在這裏檢查錯誤的正則表達式:http://ideone.com/c5xnUJ –

+0

A注意提示你的正確答案已經足夠了:)。我在此期間解決了我的問題,並表示感謝您的幫助:)。 – jeromegamez

回答

-1

對於-b--i--u-您可以使用此行

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

對於-h-,您可以使用此一:從佩德羅評論後添加ungreedy修改:

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

更新

更新2:從@ L'L'升有幫助的註釋去掉後,從字符類|小號

+2

角色類中的「OR」並不符合你的想法;這是一個文字,所以你匹配'|'。 –

+1

謝謝@ l'L'l,我修好了! – jeromegamez

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> 

DEMO

http://ideone.com/LdcMbO

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)); 
相關問題