有没有办法将这些正则表达式压缩成一个?

时间:2014-11-03 18:25:17

标签: php regex

我有几个目录,每个目录包含大约10,000个文件。我想读取文件并将数据写入数据库中的特定列。我遇到的问题是速度。我正在使用preg_replace_callback将多个正则表达式存储在数组中。

如果可能的话,我需要帮助弄清楚如何将正则表达式压缩成单个表达式,或者找到一种在没有正则表达式的情况下实现相同目标的更好方法。

每个数据文件都是这样的,只是更大:

Company: Google, Since: 1998
Longitude: 37.422, Latitude: 122.084
Email: google@gmail.com
...

我将使用以下代码来演示性能:

class DataParser
{
    public $data;
    public $regexes;

    function __construct()
    {
        $this->regexes = array(
            'company_since' => '/Company: ([a-z_]+), Since: ([0-9]+)/i',
            'longit_latit' => '/Longitude: ([0-9.]+), Latitude: ([0-9.]+)/',
            'email' => '/Email: ([a-z0-9_\-.]+)@([a-z0-9_\-.]+)/i'
        );
    }

    function parse($data)
    {
        static $key = 0;

        foreach ($this->regexes as $name => $regex) {
            preg_replace_callback($regex, function($str) use($name, $key)
            {
                $this->data[$key][$name] = array($str[1], $str[2]);
            }, $data);
        }

        $key++;
    }
}

// This is normally in a file
$data = 'Company: Google, Since: 1998' . PHP_EOL
      . 'Longitude: 37.422, Latitude: 122.084' . PHP_EOL
      . 'Email: google@gmail.com';

$exec_start = microtime(true);
$parser = new DataParser();

for ($i = 0; $i < 10000; $i++) {
    $parser->parse($data);
}

echo round(microtime(true) - $exec_start, 5), '/s';

echo '<pre>', print_r($parser->data, true), '</pre>';

输出结果为:

0.13795/s

Array
(
    [0] => Array
        (
            [company_since] => Array
                (
                    [0] => Google
                    [1] => 1998
                )

            [longit_latit] => Array
                (
                    [0] => 37.422
                    [1] => 122.084
                )

            [email] => Array
                (
                    [0] => google
                    [1] => gmail.com
                )

        )

    [1] => Array
        (
            [company_since] => Array
                (
                    [0] => Google
                    [1] => 1998
                )
...

每个添加的正则表达式脚本越来越慢,但只有一个正则表达式表现良好。也许我在问错误的问题或试图解决错误的问题,在这种情况下:有什么更好的方法可以做到这一点?

0 个答案:

没有答案