Шаблон регулярного выражения работает со строкой, но не с загруженным содержимым файла

Я хочу выделить слова между; и: из файла XML, например, здесь слово Index

бла бла бла; Индекс: bla bla

файл загружается по его URL с помощью file_get_contents

$output = file_get_contents("https://fr.wikipedia.org/wiki/Sp%C3%A9cial:Exporter/Base_de_donn%C3%A9es");
       
 preg_match_all('/\;.[a-zA-Z]+.\:/', $output, $matches, PREG_SET_ORDER, 0);
 var_dump($matches);

Шаблон регулярного выражения отлично работает с тем же содержимым файла, используя regex101, а также когда я копирую текст в строковую переменную. Но приведенный выше код не работает, он возвращает только последнее совпадение.

Что я делаю неправильно ?

PS: Я также попытался загрузить файл XML с помощью DOMDocument .. Тот же результат.


person lady_OC    schedule 03.06.2017    source источник
comment
Вы должны сделать /;[^:;]+:/   -  person revo    schedule 03.06.2017
comment
Если я хорошо понимаю, вы хотите извлечь: Index, Vue matérialisée, Partitionnement, [[RAID (informatique)|RAID]] (''Redundant array of inexpensive disks''), Table de Hashage (anglais ''hashing''), ..., Journal   -  person Casimir et Hippolyte    schedule 03.06.2017
comment
Я хочу извлекать только слова или набор слов без каких-либо специальных символов или цифр ... поэтому я использую [a-zA-Z]   -  person lady_OC    schedule 03.06.2017
comment
и регулярное выражение, которое я использую, работает нормально, проблема не в этом ..   -  person lady_OC    schedule 03.06.2017
comment
Я думаю, он тоже должен работать, просто потому, что этот шаблон отлично работает с другими движками регулярных выражений. Есть ли у вас возможность использовать модуль regex вместо re?   -  person Scott Weaver    schedule 03.06.2017
comment
@ sweaver2112: обратите внимание, что это вопрос PHP, а не Python.   -  person Casimir et Hippolyte    schedule 03.06.2017


Ответы (1)


Способ сделать это с низким объемом памяти, несколько соображений:

  • файл большой (не огромный, но большой).
  • тот факт, что вы имеете дело с xml-файлом, не очень важен для этого случая, поскольку текст, который вы ищете, следует в собственном строчном формате (формат XWiki для стандартных определений), который не зависит от формата xml. Однако, если вы абсолютно хотите использовать здесь анализатор XML для извлечения содержимого тега text, я предлагаю использовать XMLReader вместо DOMDocument.
  • строки, которые вы ищете, всегда являются одиночными, начинаются с ; (без отступов) и всегда сразу же сопровождаются : на следующей строке.

Как только вы увидите это (щелкните правой кнопкой мыши, исходный код), вы можете выбрать чтение файла по строке (вместо загрузки всего файла с помощью file_get_contents) и использовать функцию генератора для выбора интересных строк:

$url = 'https://fr.wikipedia.org/wiki/Sp%C3%A9cial:Exporter/Base_de_donn%C3%A9es';

$handle = fopen($url, 'rb');

function filterLines($handle) {
    while (feof($handle) !== true) {
        $line = fgets($handle);
        if ( $line[0] == ';' ) {
            $temp = $line;
            continue;
        } 
        if ( $line[0] == ':' && $temp )
            yield $temp;            

        $temp = false;
    }
}

foreach (filterLines($handle) as $line) {
    if ( preg_match_all('~\b\p{Latin}+(?: \p{Latin}+)*\b~u', $line, $matches) )
        echo implode(', ', $matches[0]), PHP_EOL;
}

fclose($handle);
person Casimir et Hippolyte    schedule 03.06.2017
comment
строки, которые вы ищете, всегда являются отдельными строками, начиная с; (без отступа) и всегда сразу после: на следующей строке. - это не кажется правильным. - person Scott Weaver; 03.06.2017
comment
@ sweaver2112: вы не смотрите на источник кода (вы видите xml со стилем по умолчанию вашего браузера): щелкните правой кнопкой мыши и отобразите источник кода. - person Casimir et Hippolyte; 03.06.2017
comment
но даже с привязкой в ​​начале строки все шаблоны, которые я пробовал, таймаут на regex101.com с python (все остальные работают нормально). здесь должна быть ошибка в re ?? - person Scott Weaver; 03.06.2017
comment
Я не знаю, я не видел ваших выкроек, обратите внимание также, что строка очень большая. Этот работает с pcre: regex101.com/r/CQy2wj/1 - person Casimir et Hippolyte; 03.06.2017
comment
Мне не нужно использовать синтаксический анализатор XML ... просто упомянул тот факт, что я пробовал его, так как я не мог понять проблему ... Большое спасибо за четкий ответ :) он работает нормально. - person lady_OC; 04.06.2017