2010-07-18 5 views
9

उदाहरण:केवल preg_match या preg_match_all के साथ नामित समूहों को वापस कैसे करें?

$string = "This is some text written on 2010-07-18."; 
preg_match('|(?<date>\d\d\d\d-\d\d-\d\d)|i', $string, $arr_result); 
print_r($arr_result); 

रिटर्न:

Array 
(
    [0] => 2010-07-18 
    [date] => 2010-07-18 
    [1] => 2010-07-18 
) 

लेकिन मैं इसे होना चाहते हैं:

Array 
(
    [date] => 2010-07-18 
) 

PHP के पीडीओ वस्तु में वहाँ एक विकल्प है कि को हटाने के द्वारा डेटाबेस से परिणाम फ़िल्टर है ये डुप्लिकेट क्रमांकित मान: PDO::FETCH_ASSOC। लेकिन मैंने अभी तक PHP में पीसीआरई कार्यों के लिए समान संशोधक नहीं देखा है।

उत्तर

3

मुझे नहीं लगता कि आप preg_* कर सकते हैं, लेकिन आप इसे सरल लूप के साथ कर सकते हैं। लेकिन मुझे नहीं पता कि उन तत्वों को एक समस्या क्यों उत्पन्न हुई।

+0

छोटे सरणी में यह कोई समस्या नहीं पैदा करता है लेकिन बहुत सारे पैटर्न में बहुत अधिक पैटर्न में उच्च स्मृति आवश्यकताओं के साथ समस्या हो सकती है। दूसरा, यह उस तरह से क्लीनर दिखता है, और वहां (इस गैर मौजूद संशोधक के साथ) कोड की एक पंक्ति कम होगी, इसलिए त्रुटि की संभावना कम होगी। – rsk82

+0

इसके विपरीत: क्योंकि यह पीसीआरई द्वारा नहीं किया जा सकता है, आपको अधिक कोड जोड़ना होगा, जहां और समस्याएं हो सकती हैं। – Charles

+0

मेरा मतलब सरणी में अतिरिक्त तत्व था। – Maerlyn

-1

इस प्रयास करें:

$string = "This is some text written on 2010-07-18."; 
preg_match('|(?<date>\d\d\d\d-\d\d-\d\d)|i',$string,$arr_result); 
echo $arr_result['date']; 
+0

नहीं, यह गलत है, मेरा मतलब है कि संख्याओं को स्वचालित रूप से हटाने के लिए एक संशोधक का मतलब है, यह multibranched सरणी पर इतना आसान नहीं है कि preg_match_all – rsk82

9

preg_match किसी भी झंडा या विकल्प है कि यह केवल रिटर्न नामित मैचों (अभी तक) नहीं है। तो आप जो चाहते हैं वह सीधे संभव नहीं है। आप अपने मैचों सरणी से कुंजी गैर फिटिंग के साथ सभी आइटम निकाल सकते हैं और फिर आप के लिए आप क्या देख रहे हैं मिलता है हालांकि:

$matches = array_intersect_key($matches, array_flip(array('name', 'likes'))); 

Demo

3

यह भी संभव वापसी से पहले सभी संख्यात्मक अनुक्रमित अनसेट करने के लिए:

foreach (range(0, floor(count($arr_result)/2)) as $index) { 
    unset($arr_result[$index]); 
} 
1

the answer की ही तरह है कि ऊपर तैनात hakre, मैं इस स्निपेट का उपयोग सिर्फ नाम वाले पैरामीटर प्राप्त करने के लिए:

$subject = "This is some text written on 2010-07-18."; 
$pattern = '|(?<date>\d\d\d\d-\d\d-\d\d)|i'; 
preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER); 
echo '<pre>Before Diff: ', print_r($matches, 1), '</pre>'; 
$matches = array_diff_key($matches[0], range(0, count($matches[0]))); 
echo '<pre>After Diff: ', print_r($matches, 1), '</pre>'; 

... जो इस निर्माण करता है: preg_match या preg_match_all साथ

Before Array 
(
    [0] => Array 
     (
      [0] => 2010-07-18 
      [date] => 2010-07-18 
      [1] => 2010-07-18 
     ) 

) 
After Array 
(
    [date] => 2010-07-18 
) 
+0

उत्पन्न कर सकता है यह वह है जो मेरे लिए काम करता है। धन्यवाद –

8

कैसे वापस जाने के लिए केवल नाम के समूहों?

यह वर्तमान में (PHP7) संभव नहीं है। आपको हमेशा मिश्रित प्रकार की सरणी मिल जाएगी, जिसमें संख्यात्मक और नामित कुंजी होंगी।

यह subpattern तो नाम से अपनी सामान्य संख्यात्मक स्थिति से मेल खाता है सरणी में अनुक्रमित किया जाएगा और यह भी:

बोली पीएचपी पुस्तिका (http://php.net/manual/en/regexp.reference.subpatterns.php) देता है।


समस्या निम्नलिखित कोड के टुकड़े मदद कर सकता है हल करने के लिए:

1. फ़िल्टर सारणी पर एक is_string जांच का उपयोग करके सरणी कुंजी (के लिए PHP5.6 +)

$array_filtered = array_filter($array, "is_string", ARRAY_FILTER_USE_KEY); 

2।तत्वों से अधिक foreach और सेट नहीं करता है, तो सरणी कुंजी is_int() (सभी पीएचपी संस्करणों)

/** 
* @param array $array 
* @return array 
*/ 
function dropNumericKeys(array $array) 
{ 
    foreach ($array as $key => $value) { 
     if (is_int($key)) { 
      unset($array[$key]); 
     } 
    } 
    return $array; 
} 

इसका एक सरल PHP समारोह dropNumericKeys() नाम दिया है। preg_match*() मिलान के लिए नामित समूहों का उपयोग करके चलाने के बाद मैचों की सरणी के बाद-प्रोसेसिंग के लिए। फ़ंक्शन $array स्वीकार करता है। यह सरणी को पुन: सक्रिय करता है और पूर्णांक प्रकार के साथ सभी कुंजियों को हटा देता है/अनसेट करता है, स्ट्रिंग प्रकार के बिना कुंजियों को छोड़ देता है। अंत में, फ़ंक्शन "अब" नाम वाली कुंजी के साथ सरणी देता है।

नोट: फ़ंक्शन PHP डाउनवर्ड कॉम्पटिबिलिटी के लिए है। यह सभी संस्करणों पर काम करता है। array_filter समाधान स्थिर ARRAY_FILTER_USE_KEY पर निर्भर करता है, जो केवल PHP5.6 + पर उपलब्ध है। देखें http://php.net/manual/de/array.constants.php#constant.array-filter-use-key

+0

यदि आपके पास # 1 – Meisner

+2

के रूप में सरल समाधान है तो फ़ंक्शन को परिभाषित क्यों करें PHP फ़ंक्शन डाउनवर्ड कॉम्पटिबिलिटी के लिए है। यह सभी संस्करणों पर काम करता है। 'Array_filter' समाधान स्थिर' ARRAY_FILTER_USE_KEY' पर निर्भर करता है, जो केवल PHP5.6 + पर उपलब्ध है। Http://php.net/manual/de/array.constants.php#constant.array-filter-use-key देखें –

0

मैं अपनी पोस्ट में पढ़ा है कि इन भविष्य स्मृति आदि ... के संभावित भार के हैं इस मामले में, क्यों no't एक सेट नहीं (के साथ हल किया जा सकता है):

$string = "This is some text written on 2010-07-18."; 
preg_match('|(?<date>\d{4}-\d{2}-\d{2})|i', $string, $arr_result); 
$date = array("date" => $arr_result['date']); 
unset($arr_result, $string);//delete array and string preg_match origen 

print_r($date); 
//or create a new: 
// $arr_result = $date; 
//print_r($arr_result); 
0

मैं शुरू की कोड से कुछ का उपयोग करें और यह अंतिम कोड 5.6+ php पर काम करता है:

$re = '/\d+\r\n(?<start>[\d\0:]+),\d+\s--\>\s(?<end>[\d\0:]+),.*\r\nHOME.*\r\nGPS\((?<x>[\d\.]+),(?<y>[\d\.]+),(?<d>[\d\.]+)\)\sBAROMETER\:(?<h>[\d\.]+)/'; 

$str= file_get_contents($srtFile); 
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0); 
echo '<pre>'; 
$filtered=array_map(function ($d){ 
    return $array_filtered = array_filter($d, "is_string", ARRAY_FILTER_USE_KEY); 
    },$matches); 
var_dump($filtered); 

यदि आप रुचि रखते यह क्या यह एक str फ़ाइल कि DJI ड्रोन जबकि vi रिकॉर्डिंग उत्पन्न से स्थिति डेटा को पढ़ने करता हैं डियो।

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