2017-01-10 5 views
1

私はregexを使って最初にいくつかのファイルからURLを抽出しています。ファイルには最大250k行のテキストを含めることができます。ファイル内の各行は、$column7という配列値に渡されます。以下は、私が望んでいたよりもはるかに長い時間がかかります。 20k行のURLを抽出するには最大1分かかる可能性があります。ドメインを抽出するには、URLの結果が入力されるので2〜3回かかることがありますので、私はそれがより速くなると期待しています。これを大幅にスピードアップするためにできることはありますか?ランタイムの問題 - 最大150k行の正規表現URL。

// EXTRACT URLS 
$regex = '/(https?\:\/\/|www)[^(\"|\\\) ]+/i'; 
$urls = array(); 
for ($i = 0; $i < count($column7); ++$i) { 
    preg_match_all($regex, $column7[$i], $matches[$i]); 
    $urls = array_merge($urls, $matches[$i][0]); 
} 

// EXTRACT DOMAINS 
$regex = '/(https?\:\/\/|www)[^\/ ]+/i'; 
$domains = array(); 
for ($i = 0; $i < count($urls); ++$i) { 
    preg_match_all($regex, $urls[$i], $matches[$i]); 
    $domains = array_merge($domains, $matches[$i][0]); 
} 
+1

1分であなたは、私はそれよりも高速な方法があるとは思わない20Kラインを抽出することができるならば... –

+1

'preg_match_all'行を行単位で実行していますか?どうして? – revo

+1

なぜ 'array_merge'を使うのですか?' $ urls [] = $ $ [$ i] [0] 'と十分にマッチしないのですか?なぜ$は[$ i] 'であり、単に' $ matches'ではないのですか? – Toto

答えて

1

最初のループでもドメインを抽出できると思います。このような正規表現で

/(?:https?\:\/\/|www)([^\/ ]+)[^(\"|\\\) ]+/i' 

参照:([^\/ ]+)は、ドメインの一致するグループであるhttps://regex101.com/r/rUGOtj/1

そして、あなたは$で、この試合のグループにアクセスすることができます一致[$ i]の[1]