我正在尝试按字母顺序将一个固定大小的文本块写入其他固定大小的文本列表中。
为了让您了解它的样子:
;Config generated on 2012-11-12 14:03:59
;Header1
exten => 01243573056,1,Answer()
exten => 01243573056,n,ResetCDR()
exten => 01243573056,n,Set(CDR(accountcode)=21)
exten => 01243573056,n,Set(CDR(userfield)=inbound)
exten => 01243573056,n,Set(MONITOR_FILENAME=Header1_${UNIQUEID})
exten => 01243573056,n,Set(CALLERID(name)=Header1)
exten => 01243573056,n,Queue(Header1)
exten => 01243573056,n,Hangup()
;Header2
exten => 01243573057,1,Goto(IVR,a,1)
exten => 01243573057,50,ResetCDR()
exten => 01243573057,n,Set(CDR(accountcode)=118)
exten => 01243573057,n,Set(CDR(userfield)=inbound)
exten => 01243573057,n,Set(MONITOR_FILENAME=Header2_${UNIQUEID})
exten => 01243573057,n,Set(CALLERID(name)=Header2)
exten => 01243573057,n,Queue(Header2)
exten => 01243573057,n,Hangup()
对这个巨大的引语抱歉,
所以他们都符合相同的模板(编辑,他们大多数情况下,Header2块是一个不好的例子)在标题之后但是顶部有标志,而文本文件末尾的赔率和结尾需要在那里为他们配置的程序。
然而,使用这个例子,我需要找到Header1的块结束的地方,并且Header2的块开始,然后在Header1的块之后插入Header3的块,以便它们最终按字母顺序排列。
我正在考虑使用fseek()
,但它不会从我能看到的内容中搜索文字。
任何帮助都将不胜感激。
答案 0 :(得分:0)
您粘贴的文件没有固定大小的注册。
例如:
exten => 01243573056,n,Set(CDR(accountcode)=21) // in Header1
exten => 01243573057,n,Set(CDR(accountcode)=118) // in Header2: it has 1 byte more
您必须将字节数传递给fseek函数,以避免对它们进行读取。 使用此结构,您必须读取文件以搜索; Header * X *直到找到它。
如果使用填充具有固定大小,则可以在fseeking时使用 n * sizeof(register)。
答案 1 :(得分:0)
你可以逐行读取它,如果行以“[”记录在哈希中的行位置开头,例如。
这种方式在freepbx.org核心中组织,您可以阅读它以获得有关解析的更多想法。
但正确的星号解决方案是使用gosub或宏,只存储params而不是一次又一次地写同一个拨号方案。
答案 2 :(得分:0)
您可以编写一个简单的Tokenizer / Parser,并使用file读取每个char或parse行。
$lines = file('extensions.conf');
foreach ($lines as $num => $line) {
// simple parse with compare or strpos
if (trim($line) == ';Header2') {
echo "Match at Line #{$num}: " . $line . "\n";
}
}