2009-03-25 7 views
6

मेरे पास पैटर्न से भरा एक सरणी है जिसे मुझे मिलान करने की आवश्यकता है। ऐसा करने के लिए कोई तरीका,() लूप के अलावा? मैं इसे कम से कम सीपीयू गहन तरीके से करने की कोशिश कर रहा हूं, क्योंकि मैं हर मिनट में दर्जनों करूँगा।आप preg_match कैसे करते हैं जहां पैटर्न एक सरणी है, php में?

रियल दुनिया उदाहरण इम एक लिंक की स्थिति चेकर, जो विभिन्न ऑनलाइन वीडियो साइटों के लिंक की जाँच करेगा निर्माण, यह सुनिश्चित करें कि वीडियो अभी भी रहते हैं, अत:। प्रत्येक डोमेन में कई "मृत कीवर्ड" होते हैं, यदि ये किसी पृष्ठ के HTML में पाए जाते हैं, तो इसका अर्थ है कि फ़ाइल हटा दी गई थी। ये सरणी में संग्रहित हैं। मुझे पेज के एचटीएमएल आउटपुट के खिलाफ सरणी पीएफ एरे से मेल खाना चाहिए।

उत्तर

20

सबसे पहले, यदि आप सचमुच ही दर्जनों हर मिनट कर रहे हैं, तो मैं इस मामले में प्रदर्शन के बारे में बहुत चिंता नहीं करता। इन मैचों में बहुत जल्दी कर रहे हैं, और मुझे नहीं लगता कि इस तरह से अपनी पैटर्न सरणी के माध्यम से पुनरावृत्ति और अलग से preg_match फोन करके आप एक प्रदर्शन समस्या है करने के लिए जा रहे हैं:

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

आप वास्तव में एक में सभी पैटर्न गठजोड़ कर सकते हैं का उपयोग कर or ऑपरेटर कुछ लोगों की तरह सुझाव दे रहे हैं, लेकिन सिर्फ उन्हें एक | के साथ एक साथ थप्पड़ मारता नहीं है। यह बुरी तरह अगर आपके पैटर्न के किसी भी या ऑपरेटर शामिल टूट जाएगा।

मैं सिफारिश करेंगे कम से कम की तरह कोष्ठक का उपयोग कर अपने पैटर्न समूहीकरण:

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

लेकिन ... मैं सच में यकीन है कि अगर यह तेजी से किया जा रहा समाप्त होता है नहीं कर रहा हूँ। कुछ उन्हें लूप करने के लिए है, चाहे वह preg_match या PHP है। अगर मुझे लगता है कि मुझे लगता है कि व्यक्तिगत मैच पढ़ने और बनाए रखने के लिए तेज़ और आसान के करीब होंगे।

आखिरकार, यदि प्रदर्शन आप यहां देख रहे हैं, तो मुझे लगता है कि सबसे महत्वपूर्ण बात यह है कि गैर रेगेक्स मैचों को एक साधारण "स्ट्रिंग में" चेक में खींचें। मैं कल्पना करता हूं कि आपके कुछ चेक सरल स्ट्रिंग चेक होना चाहिए जैसे कि यह देखने के लिए कि "यह साइट बंद है" पृष्ठ पर है या नहीं।

तो यह कर:

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

और के रूप में कई preg_match() संभव के रूप में शायद अपने सबसे अच्छे लाभ होने जा रहा है परहेज। strpos()बहुतpreg_match() से तेज़ है।

+4

गूगलर के लिए, एक बार आप एक मैच मिल गया है foreach लूप से बाहर तोड़ने के लिए ब्रेक (http://www.php.net/manual/en/control-structures.break.php) का उपयोग पर विचार करते हैं! –

+2

मेरा मानना ​​है कि यह होना चाहिए: कम से कम $ पैटर्न के रूप में $ pattern_array), कम से कम PHP – hellomynameisjoel

+1

के मेरे संस्करण में आप लोगों को ... आपकी टिप्पणियों को संबोधित करने के लिए संपादित किया गया है। – danieltalsky

0

यदि आपके पास पैटर्न का एक गुच्छा है, तो आप उन्हें एक नियमित अभिव्यक्ति में जोड़ सकते हैं और उससे मेल खाते हैं। एक पाश के लिए कोई ज़रूरत नहीं है।

1

आप केवल एक-दूसरे स्ट्रिंग में एक स्ट्रिंग की उपस्थिति के लिए खोज रहे हैं, strpos का उपयोग के रूप में यह तेजी से होता है।

अन्यथा, आप बस पैटर्न के सरणी पर पुनरावृति सकता है, preg_match हर बार बुला।

10
// assuming you have something like this 
$patterns = array('a','b','\w'); 

// converts the array into a regex friendly or list 
$patterns_flattened = implode('|', $patterns); 

if (preg_match('/'. $patterns_flattened .'/', $string, $matches)) 
{ 
} 

// PS: that's off the top of my head, I didn't check it in a code editor 
+1

विल बिना कोष्ठक/कोष्ठक इस काम के आसपास "पैटर्न"? – JedatKinports

0

एचटीएमएल पर str_replace() करने के बारे में क्या आप अपने सरणी का उपयोग कर रहे हैं और फिर जांच कर रहे हैं कि मूल HTML मूल के बराबर है या नहीं?यह बहुत तेजी से होगा:

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

str_replace काम नहीं कर रहा है, तो आप एक सटीक मिलान चाहते –

2

अपने पैटर्न कई व्हाइटस्पेस शामिल नहीं है तो एक अन्य विकल्प सरणियों त्याग और /x संशोधक का उपयोग करने के लिए किया जाएगा। अब नियमित अभिव्यक्ति की अपनी सूची इस प्रकार दिखाई देगा: /x संशोधक की सहायता से

$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"; 

, खाली स्थान के पूरी तरह से जब एक चरित्र वर्ग में या एक बैकस्लैश से पहले को छोड़कर, नजरअंदाज कर दिया है। इसके बाद के संस्करण की तरह टिप्पणियां भी अनुमति दी।

यह सरणी के माध्यम से लूपिंग से बच जाएगा।

संबंधित मुद्दे