2013-06-06 4 views
9

यहाँ मेरी स्ट्रिंग है:Regex मैच में स्ट्रिंग के कुछ भागों पर ध्यान न दें

address='St Marks Church',notes='The North East\'s premier...' 

regex मैं match_all का उपयोग कर विभिन्न भागों हड़पने के लिए उपयोग कर रहा हूँ

'/(address|notes)='(.+?)'/i' 

है परिणाम हैं:

पता => सेंट मार्क चर्च
नोट्स => उत्तर पूर्व \

मैं नोट्स के लिए चरित्र को अनदेखा करने के लिए कैसे प्राप्त कर सकता हूं?

+1

क्या आप केवल अपनी अभिव्यक्ति में अल्फान्यूमेरिक वर्णों पर विचार करना चाहते हैं? –

+0

\ 'को छोड़कर' और दूसरे 'के बीच मूल रूप से कुछ भी नहीं। मैं एक रेगेक्स नौसिखिया का थोड़ा सा हूँ, मुझे डर है कि शायद पहले भी गलत हो गया है? –

उत्तर

4
नहीं

सुनिश्चित करें कि आप हियरडॉक या दोहरे उद्धरण चिह्नों के साथ अपने स्ट्रिंग लपेटकर कर रहे हैं, लेकिन एक कम लालची दृष्टिकोण:

$str4 = 'address="St Marks Church",notes="The North East\'s premier..."'; 
preg_match_all('~(address|notes)="([^"]*)"~i',$str4,$matches); 
print_r($matches); 

आउटपुट

Array 
(
    [0] => Array 
     (
      [0] => address="St Marks Church" 
      [1] => notes="The North East's premier..." 
     ) 

    [1] => Array 
     (
      [0] => address 
      [1] => notes 
     ) 

    [2] => Array 
     (
      [0] => St Marks Church 
      [1] => The North East's premier... 
     ) 

) 

preg_split साथ एक अन्य विधि:

//split the string at the comma 
//assumes no commas in text 
$parts = preg_split('!,!', $string); 
foreach($parts as $key=>$value){ 
    //split the values at the = sign 
    $parts[$key]=preg_split('!=!',$value); 
    foreach($parts[$key] as $k2=>$v2){ 
     //trim the quotes out and remove the slashes 
     $parts[$key][$k2]=stripslashes(trim($v2,"'")); 
    } 
} 

आउटपुट इस तरह दिखता है:

Array 
(
    [0] => Array 
     (
      [0] => address 
      [1] => St Marks Church 
     ) 

    [1] => Array 
     (
      [0] => notes 
      [1] => The North East's premier... 
     ) 

) 

सुपर धीमी गति से पुराने skool विधि:

$len = strlen($string); 
$key = ""; 
$value = ""; 
$store = array(); 
$pos = 0; 
$mode = 'key'; 
while($pos < $len){ 
    switch($string[$pos]){ 
    case $string[$pos]==='=': 
     $mode = 'value'; 
     break; 
    case $string[$pos]===",": 
     $store[$key]=trim($value,"'"); 
     $key=$value=''; 
     $mode = 'key'; 
     break; 
    default: 
     $$mode .= $string[$pos]; 
    } 

    $pos++; 
} 
     $store[$key]=trim($value,"'"); 
+0

आपकी पहली विधि विधि के अनुरूप इनपुट स्ट्रिंग को समायोजित करती है, इस विधि को हटाया जाना चाहिए। दूसरा 'preg_split() 'का उपयोग करता है जहां' विस्फोट()' समझदार फ़ंक्शन कॉल है। इसके अलावा, यदि स्ट्रिंग में '\ '' संभव है, तो यह मानना ​​उचित है कि ',' और '=' भी संभव है। तीसरा, मैंने अभी तक परीक्षण नहीं किया है, लेकिन इसमें या तो टाइपो है या वेरिएबल वैरिएबल को नियोजित कर रहा है जिसे जब भी संभव हो से बचा जाना चाहिए। – mickmackusa

+0

मैंने अपना डाउनवोट हटा दिया क्योंकि मैं सराहना करता हूं कि आप अपना जवाब ठीक करने की कोशिश कर रहे हैं। अफसोस की बात है, मुझे लगता है कि मुझे फिर से हटाना पड़ा क्योंकि यह जवाब गरीब और/या अविश्वसनीय तरीकों का सुझाव दे रहा है। – mickmackusa

+0

खराब डेटा संग्रहण विधियों के लिए रियायतें कभी सलाह नहीं दी जाती है।यह टेक्स्ट स्ट्रीम JSON, XML, या यहां तक ​​कि CSV में संग्रहीत की जानी चाहिए और आदर्श रूप से उद्योग मानक विधियों के साथ संसाधित की जानी चाहिए। यद्यपि अपनी राय की सराहना करते हैं। –

1

आप समाप्त कर बोली कि एक बैकस्लैश इस प्रकार से पहले नहीं किया गया है अप करने के लिए मैच चाहिए:

(address|notes)='(.*?)[^\\]' 

यह [^\\] बलों चरित्र तुरंत 'चरित्र पूर्ववर्ती लेकिन एक बैकस्लैश कुछ भी किया जाना है।

+0

क्या वह इनपुट करेगा यदि इनपुट है: '" address = '।, नोट्स =' उत्तर पूर्व \ 'का प्रीमियर ...' ''? – anubhava

+0

जैसा कि @anubhava ने बताया है, यह उत्तर गलत है और अपेक्षित वापसी मूल्यों को उलझाएगा। https://regex101.com/r/90fBSr/1 (भ्रामक के रूप में डाउनवॉटेड) – mickmackusa

1

क्योंकि आप पोस्ट किया है कि आप match_all उपयोग कर रहे हैं और अपने प्रोफ़ाइल में शीर्ष टैग php और wordpress कर रहे हैं, मुझे लगता है कि आप उपयोग कर रहे ग्रहण करने के लिए उचित है PHP के साथ preg_match_all()

निम्नलिखित पैटर्न आवश्यक सबस्ट्रिंग का मिलान करेगा वांछित buildyour के साहचर्य सरणी:

पैटर्न है कि एक fullstring मैच और 1 पर कब्जा समूह उत्पन्न:

  1. /(address|notes)='\K(?:\\\'|[^'])*/ (166 कदम, demo link)
  2. /(address|notes)='\K.*?(?=(?<!\\)')/ (218 कदम, demo link)

पैटर्न है कि 2 कब्जा समूह जेनरेट:

  1. /(address|notes)='((?:\\\'|[^'])*)/ (168 कदम, demo link)
  2. /(address|notes)='(.*?(?<!\\))'/ (209 कदम, demo link)

कोड: (Demo)

$string="address='St Marks Church',notes='The North East\'s premier...'"; 

if(preg_match_all("/(address|notes)='\K(?:\\\'|[^'])*/",$string,$out)){ 
    $result=array_combine($out[1],$out[0]); 
} 
var_dump($result); 

echo "\n---\n"; 

if(preg_match_all("/(address|notes)='((?:\\\'|[^'])*)/",$string,$out,PREG_SET_ORDER)){ 
    $result=array_combine(array_column($out,1),array_column($out,2)); 
} 
var_dump($result); 

आउटपुट:

array(2) { 
    ["address"]=> 
    string(15) "St Marks Church" 
    ["notes"]=> 
    string(28) "The North East\'s premier..." 
} 

--- 
array(2) { 
    ["address"]=> 
    string(15) "St Marks Church" 
    ["notes"]=> 
    string(28) "The North East\'s premier..." 
} 

पैटर्न # 1 और # 3 गैर-एस्ट्रोफ़ेफ़ वर्णों या एस्ट्रोफ़ेस को बैकस्लैश से पहले अनुमति देने के विकल्प का उपयोग नहीं करते हैं।

पैटर्न # 2 और # 4 (PHP demo के साथ लागू होने पर अतिरिक्त बैकस्लैश की आवश्यकता होगी) यह सुनिश्चित करने के लिए लुकराउंड का उपयोग करें कि बैकस्लैश से पहले एस्ट्रोफ़ेस मैच समाप्त नहीं करते हैं।

कुछ नोट:

  • कैप्चर समूहों, विकल्प का उपयोग करना, और lookarounds पैटर्न दक्षता खर्च होता है। इन घटकों के उपयोग को सीमित करने से प्रदर्शन में सुधार होगा। नकारात्मक चरित्र वर्गों का उपयोग अक्सर प्रदर्शन में सुधार करता है।

  • \K (जो पूर्णांक मिलान को पुनरारंभ करता है) का उपयोग कर कैप्चर समूहों को कम करने की कोशिश करते समय उपयोगी होता है और यह आउटपुट सरणी के आकार को कम करता है।

+0

@PaulPhillips 4 साल बाद, आप अब regex पर एक नौसिखिया नहीं हो सकता है। कृपया इस पृष्ठ पर सभी उत्तरों की समीक्षा करें। अफसोस की बात है कि इस पृष्ठ पर अन्य उत्तरों गलत/गलत हैं और समय के साथ ऊपर उठ गए हैं (जिसका अर्थ है कि वे वर्षों से पाठकों को गलत तरीके से गलत कर रहे हैं)। अगर आपके उत्तर के बारे में आपके कोई प्रश्न हैं या अन्य उत्तरों सही क्यों नहीं हैं, तो मुझे समझाने में खुशी होगी। – mickmackusa

+0

हे मिक आप हर किसी के पिछले जवाब या सिर्फ मेरा ट्रोलिंग? –

+0

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

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