Nasıl php, desen dizisi olan bir preg_match yapabilirim?

5 Cevap php

Ben eşleşti ihtiyacım desen dolu bir dizi var. A için () döngü dışında bunu yapmak için herhangi bir yolu? Ben bu onlarca her dakika yapıyor olacağından, az CPU yoğun bir şekilde bunu yapmaya çalışıyor Im.

Gerçek hayattan örnek Im videolar hala canlı olduğundan emin olmak için, çeşitli online video sitelerine bağlantıları kontrol edecek bir bağlantı durumu denetimi, yapı vardır. Her etki alanı, bu sayfanın html bulunursa, bu dosya silindi demektir, birkaç "ölü anahtar kelime" vardır. Bunlar dizi içinde saklanır. Ben sayfanın html karşısına çıktı, dizinin pf içeriğini maç gerekir.

5 Cevap

Kelimenin tam anlamıyla sadece yapıyorsun, her şeyden önce, dozens, her minute, o zaman ben bu durumda performansı hakkında korkunç endişe olmaz. Bu maçı oldukça hızlı ve ben size desenler dizi yineleme ve ayrı ayrı bu gibi preg_match arayarak bir performans sorunu var gidiyoruz sanmıyorum:

$matches = false;
foreach ($pattern in $pattern_array)
{
  if (preg_match($pattern, $page))
  {
    $matches = true;
  } 
}

Sen gerçekten de bazı insanlar gibi or operatör düşündüren kullanarak tek bir bütün desenleri birleştirebilirsiniz, ama sadece bir | ile birlikte onlara tokat yok. Bu kötü kıracak senin desen varsa contain veya operatör.

Ben en azından gibi parantez kullanarak desen gruplandırma öneriyoruz:

foreach ($pattern in $patterns)
{
  $grouped_patterns[] = "(" . $pattern . ")";
}
$master_pattern = implode($grouped_patterns, "|");

Ama ... Ben bu hızlı olma biter eğer gerçekten emin değilim. Something bu preg_match veya PHP olsun, içlerinden döngü vardır. Sanırım olsaydı ben bireysel maçlar okumak ve korumak için hızlı ve kolay yakın olacağını tahmin ediyorum.

Performans Burada aradığınızı ise son olarak, yapmam gereken en önemli şey olmayan regex onay "içeren dize" basit içine maçlar çekin olduğunu düşünüyorum. Ben çek bazı "Bu Site Closed" eğer sayfada görmek isteyen gibi basit bir dize kontroller olması gerektiğini hayal ediyorum.

Yani bu yapıyor:

foreach ($string_to_match in $strings_to_match)
{
  if (strpos($page, $string_to_match) !== false))
  {
    // etc.
  }
}
foreach ($pattern in $pattern_array)
{
  if (preg_match($pattern, $page))
  {
    // etc.
  } 
}

ve preg_match() mümkün olduğunca çok kaçınarak muhtemelen en iyi kazanç olacak. strpos() preg_match() göre bir lot hızlıdır.

Eğer sadece başka bir dizede bir dize varlığı arıyorsanız daha hızlı olduğu gibi, strpos kullanın.

Aksi takdirde, sadece preg_match her zaman aradığını, desen dizi tekrarlayabilirsiniz.

Ne sizin dizi kullanarak ve orijinal HTML orijinal eşit ise daha sonra kontrol olsun HTML bir str_replace() yapmaya ne dersiniz? Bu çok hızlı olacaktır:

 $sites = array(
      'you_tube' => array('dead', 'moved'),
      ...
 );
 foreach ($sites as $site => $deadArray) {
     // get $html
     if ($html == str_replace($deadArray, '', $html)) { 
         // video is live
     }
 }

Lütfen desenler çok whitespaces içermiyorsa, başka bir seçenek dizileri kaçınmak ve /x değiştirici kullanmak olacaktır. Şimdi düzenli ifadelerin listeniz gibi olacaktır:

$regex = "/
pattern1|   # search for occurences of 'pattern1'
pa..ern2|   # wildcard search for occurences of 'pa..ern2'
pat[ ]tern| # search for 'pat tern', whitespace is escaped
mypat       # Note that the last pattern does NOT have a pipe char
/x";

/x değiştirici, boşluk tamamen ters eğik çizgi öncesinde zaman bir karakter sınıfında veya dışında, göz ardı edilir. Yukarıdaki gibi yorumlar da izin verilir.

Bu dizi aracılığıyla döngü önleyeceğini.

Eğer desen bir grup varsa, ne yapabilirim, tek bir normal ifadede onları birleştirmek ve bu maç olduğunu. Bir döngü için gerek yok.