Как получить позицию тега гиперссылки при разборе DOCX document.xml с PHP? - PullRequest
0 голосов
/ 01 октября 2018

Моя цель - проанализировать файл DOCX с помощью PHP для всех гиперссылок в формате:

<start of hyperlink(number of the first element of hyperlink in text)>, <end of hyperlink(number of the last element of hyperlink in text)>, <hyperlink text>

Например:

input : «Привет, абсолютно ужасный {adjective: distressing}(you cannot see this in .docx file) мир!»

вывод : {19, 26, «прилагательное: огорчительный»}

Пока что я сделал код для разбора всех гиперссылок как простого текста, но я не могу получить номера его позиции в тексте.Вот мой код:

define("dir", "Dictations");
define("test_file", "Dictation_Text.docx");

/**
 * @param $filename
 * @return string
 */
function getHyperLinks($filename) {
    $explode_result = explode('.', $filename);
    $extension = end($explode_result);
    if ($extension == "docx") {
        $dataFile = "word/document.xml";
    }
else {
    return "DOCX files only supported";
}
$zip = new ZipArchive;
if ($zip->open($filename) === true) {
    if (($zip_index = $zip->locateName($dataFile)) !== false) {
        $data = $zip->getFromIndex($zip_index);
        $parser = xml_parser_create();
        xml_parse_into_struct($parser, $data, $values, $indexes);
        xml_parser_free($parser);
        $result = Array();
        foreach ($indexes["W:HYPERLINK"] as $ind) {
            if ($values[$ind]["type"] == "open") {
                $result[] = $values[$ind]["attributes"]["W:ANCHOR"];
            }
        }
        return $result;
    }
    else {
        return "File " . $filename . " couldn't be found in " . document;
    }
}
    else {
        return "Couldn't open archive " . $filename;
    }
}

#TODO: getting filename from front by $_GET
$document = dir . "/" . test_file;
$result = getHyperLinks($document);
if (is_array($result)) {
    foreach ($result as $res) {
        echo $res . "\n";
    }
}
else {
    echo $result;
}

Так что я не смог найти какой-либо атрибут XML начальной позиции гиперссылки, пожалуйста, скажите мне, как получить его или каким-либо способом получить его из XMLObject или, может быть, покажите мне еще одинудобный способ анализа файла DOCX для получения всей необходимой мне информации.

1 Ответ

0 голосов
/ 20 декабря 2018

Ваш подход в целом выглядит нормально, но вы смотрите не в тот файл.

.docx элементы ссылки не сохраняются в document.xml.Странно, правда?

word / _rels / document.xml.rels содержит все эти данные (или header1.xml.rels и т. Д.).

Если вы хотите увидеть формат, переименуйте ваш .docx в .zip.Затем вы можете извлечь его и просмотреть все XML-файлы внутри.Каждая ссылка получает строку XML, поэтому, если все, что вам нужно, это ссылки, вам может вообще не понадобиться анализировать из document.xml.

Если вам нужен контекст, вы будете использовать ассоциацию переменной "Id" в каждой взаимосвязи.

...