2

我想使用 PHP 在 txt 文件目录中搜索可能出现在多个实例中的特定 ID。

当 ID 出现时,总是会在其前面出现“找到一个 XML 文件”之类的语句,在其后面出现“正在关闭 XML 文件” 。这些代表我要复制的部分的“开始”和“结束”。

然后我想将此部分复制到另一个文本文件中。这将取代我在文件中查找 ID,然后手动复制相关部分的过程。

在伪代码中,我的想法是;

while(parsing text file)
  {
  if (current line == search_ID)
    {
    loop for "Found an XML file"
    start copying
    loop for "Closing XML file"
    output string to txt file
    }
  }

所以我的问题是我将如何从搜索 ID“向上”循环,直到找到最近的“找到一个 XML 文件”?

4

2 回答 2

1

您要做的是将整个文件内容作为单个字符串读取,然后根据您在其中找到的内容将其拆分。如下:

// Read the contents of the file into $file as a string
$mainfilename = "/path/to/file.txt";
$handle = fopen($mainfilename, "r");
$file = fread($handle, filesize($mainfilename));
fclose($handle);

/* $file contains your file contents
 * $findme contains "Found an XML file"
 * $splitter contains "Closing XML file"
 */

// We only do anything if the string "Closing XML file" is inside the file
// in a place other than at the beginning of the file
if (strpos($file, $splitter) > 0) {

    // Break up $file into pieces by splitting it along "Closing XML file"
    $parts = explode($splitter, $file);

    // Traverse the newly-formed pieces
    foreach ($parts as $part) {

        // If we have "Found an XML file" contained in this piece of the file
        if (strpos($part, $findme) !== false) {

            // Split up our smaller string around "Found an XML file"
            $foundparts = explode($findme, $part);

            // The last piece will always contain the filename,
            // but only if there are two or more pieces
            // i.e. something between the strings
            if (count($foundparts) > 1) $filename = array_pop($foundparts);
            /* Do whatever you want with $filename */ 
        }
    }
}

这将做的是,假设$file == "Closing XML file gibberish goes here Found an XML file garbage Found an XML file filename.xls Closing XML file more gibberish"

  1. 检查以确保关闭 XML 文件存在于$file开头以外的位置 - 它位于结尾附近。
  2. 分成$file几块:$parts = ['', ' gibberish goes here Found an XML file garbage Found an XML file filename.xls ', ' more gibberish']
  3. 遍历$parts寻找“找到一个 XML 文件”的实例 -$parts[1]有它
  4. 分成$parts[1]几块:$foundparts = [' gibberish goes here',' garbage ', ' filename.xls ']
  5. 如果 中至少有 2 个部分$foundparts,则“弹出”最后一个元素$foundparts,因为它始终是包含文件名的元素
  6. 你现在有了文件名$filename,你可以随意使用

注意:这些函数是区分大小写的,所以如果您还想查找“找到一个 xml 文件”的实例(xml 为小写),您需要对所有 , , 进行一些字符串转换为$file全部$splitter小写和$findme

于 2013-09-07T03:45:43.820 回答
0
<?php
// Ex: OPA_4636367.xml
foreach(glob("*.txt") as $file) {
    $file_designation = explode('_', $file);
    if ($file_designation[0] == 'OPA') {
        // XML found
        // Do file_get_contents($file) or whatver
    }
}
?>
于 2013-09-02T10:14:08.707 回答