我正在逐行阅读文件。
有些行会有-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>';
};
我正在使用的标签:
-b-
<b></b>
{li> -i-
<i></i>
{li> -u-
<u></u>
{li> -h-
<h1></h1>
这是否可行,检查每个标签并以不同方式替换第一/第二次出现?
答案 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>
样本
答案 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
的有用评论后,从字符类中删除了|