【问题标题】:Regex pattern works on string but not on loaded file content正则表达式模式适用于字符串,但不适用于加载的文件内容
【发布时间】:2017-06-03 12:52:47
【问题描述】:

我想提取“;”之间的单词和 XML 文件中的“:”,例如此处的“索引”一词

bla bla bla ;索引 : 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:我还尝试使用 DOMDocument 加载 XML 文件。结果相同。

【问题讨论】:

  • 你应该这样做/;[^:;]+:/
  • 如果我理解你想提取:IndexVue matérialiséePartitionnement[[RAID (informatique)|RAID]] (''Redundant array of inexpensive disks'')Table de Hashage (anglais ''hashing''),...,Journal
  • 我只想提取单词或一组单词,没有任何特殊字符或数字。这就是我使用 [a-zA-Z] 的原因
  • 我使用的正则表达式工作正常,这不是问题..
  • @sweaver2112:注意这是一个 PHP 问题,而不是 Python 问题。

标签: php regex string preg-match file-get-contents


【解决方案1】:

一种低内存占用的方法,几个考虑因素:

  • 文件很大(不是很大但很大)。
  • 在这种情况下,您正在处理 xml 文件这一事实并不是很重要,因为您要查找的文本遵循它自己的基于行的格式(标准定义为XWiki format独立于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);

【讨论】:

  • "您要查找的行总是单行,以 ; 开头(没有缩进),并且总是紧跟在下一行的 : 之后。" - 这似乎不正确。
  • @sweaver2112:你没有看代码源(你看到的是浏览器默认样式的xml):右键显示代码源。
  • 但即使使用行首锚,我在 regex101.com 上使用 python 尝试过的所有模式都超时(所有其他模式都可以正常工作)。一定是re 这里的错误??
  • 我不知道,我没有看到你的模式,还要注意字符串非常大。这个适用于pcre:regex101.com/r/CQy2wj/1
  • 我不必使用 XML 解析器.. 只是提到了我尝试过的事实,因为我无法弄清楚问题.. 非常感谢您的明确回答 :)它工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多