dgifford / text-file
Requires
- php: >=5.4
- dgifford/array-access-trait: 1.*
- dgifford/iterator-trait: 1.*
- dgifford/property-setter-trait: 1.*
README
逐行操作文本文件的类。
适用于编辑/创建通过周围的行容易区分的段落或行的文本文件。
例如,像 .htaccess 这样的配置文件,其中段落可能由注释或if语句定义。
实例化
可以通过向构造函数提供以下内容来初始化对象
- 有效的文件路径
- 字符串
- 字符串(行)数组
$text = new TextFile( 'foo.txt' );
$text = new TextFile( "line 1\nline 2\nline 3\nline 4" );
$text = new TextFile( ["line 1", "line 2", "line 3", "line 4"] );
或者,通过使用 load 方法
$text = new TextFile();
$text->load( 'foo.txt' );
$text->load( "line 1\nline 2\nline 3\nline 4" );
$text->load( ["line 1", "line 2", "line 3", "line 4"] );
数组访问
该类实现了数组访问和数组迭代器,因此可以使用数组符号和 foreach 循环访问行。
$text->load( 'foo.txt' );
// Output the first line
echo $text[0];
// Iterate over each line
foreach( $text as $index => $line )
{
...
}
编辑
可以直接使用数组访问直接编辑行。
$text->load( 'foo.txt' );
// Change the first line
echo $text[0] = 'This is the first line';
// Delete the first line
unset( $text[0] );
以下方法在编辑时提供了更多灵活性。
delete
删除所有行:$text->delete()
删除包含字符串 'bar' 的所有行:$text->delete( 'bar' )
可以通过提供两个字符串来删除行块,以标识开始和结束行。
然而,只有当部分是唯一的(开始和结束行只出现一次)并且开始行在结束行之前时,才会删除行。
例如,要删除第一个行包含 'foo' 且最后一个行包含 'bar' 的行块
$result = $text->delete( 'bar', 'foo' );
如果成功删除块,则 $result
将为 true
,否则为 false
。
添加第三个布尔参数将使块专一,即不包含开始和结束行
$result = $text->delete( 'bar', 'foo', false );
replace
replace 方法的参数与 delete 的参数类似,只是替换行(块)包含在内。
$text->replace( 'foo', 'replace', 'bar');
这用行 'replace' 替换了第一个行包含 'bar' 且最后一个行包含 'foo' 的块。
同样,只有当块是唯一的并且开始行在结束行之前时,才会替换行。如果块无效,则返回 false。
将 false
作为第四个参数添加以替换块,但不包含开始和结束行
$text->replace( 'foo', 'replace', 'bar', false );
此方法也接受行数组作为替换
$text->replace( 'foo', ['replace', 'replace', 'replace'], 'bar', false );
find
find
返回包含搜索字符串的行的索引。它由 delete
和 replace
等方法内部使用。
要找到所有包含 'foo' 的行:$result = $text->find( 'foo' )
结果将是一个索引数组,如果没有找到行,则为 false。
此方法还可以通过添加第二个 false
参数来用于查找唯一的行
$result = $text->find( 'foo', false );
结果将是一个整数,如果没有找到行或找到多个行,则为 false
。
prepend
此方法将包含 'foo' 的单个行添加到文件的开始:$text->prepend( 'foo' )
将多行添加到文件的开始:$text->prepend( ['foo', 'foo', 'foo'] )
append
将包含 'foo' 的单个行添加到文件的末尾:$text->append( 'foo' )
将多行添加到文件的末尾:$text->append( ['foo', 'foo', 'foo'] )
add
此方法在指定行之前添加行。
在包含 'foo' 的行之前添加包含 'bar' 的行:$text->add( 'foo', 'bar' )
在包含 'foo' 的行之前添加多行:$text->add( 'foo', ['bar', 'bar', 'bar'] )
提取行
提取行的结果是包含提取行的新的 TextFile 对象。
与其他方法一样,要提取的行块由起始行和结束行中的字符串标识。
这将提取包含 'bar' 的行和包含 'foo' 的行之间的行,包括这两行。
$result = $text->extract( 'foo', 'bar' );
将 false
作为第三个参数,将排除起始行和结束行:$result = $text->extract( 'foo', 'bar', false)
省略第二个参数将提取从第一行到文件末尾的所有行,包括第一行。
$result = $text->extract( 'foo' );
输出
join
方法返回一个字符串,其中每行之间都有一个换行符。
默认情况下,使用 PHP 常量 PHP_EOL
,但可以通过以下方式设置:$text->setEOL( "\n" )
要作为字符串输出文件内容:echo $text->join()
要保存文件:$text->save( 'foo.txt' )