2012-06-28 23 views
7

यह वास्तव में एक साधारण समस्या है, लेकिन मुझे कहीं भी समाधान नहीं मिला।PHP/REGEX: कोष्ठक के भीतर एक स्ट्रिंग प्राप्त करें

मैं प्रिंसेस, के भीतर से स्ट्रिंग प्राप्त करने के लिए preg_match या preg_match_all का उपयोग करने का प्रयास कर रहा हूं लेकिन बिना किसी चिपकने वाले

अब तक, मेरी अभिव्यक्ति इस तरह दिखता है:

\([A-Za-z0-9 ]+\) 

और निम्न परिणाम देता है:

3 (खोखले प्रकाश डाला) 928-129 (< - मूल स्ट्रिंग)

(खोखला हाइलाइट) (< - परिणाम)

मैं चाहता हूं कि स्ट्रिंग कोष्ठक के भीतर स्ट्रिंग है, लेकिन बिना ब्रांड्स के। यह इस तरह दिखेगा:

खोखला उजागर

मैं शायद str_replace या कुछ और के साथ बाद में कोष्ठक की जगह सकता है, लेकिन है कि मेरे पास एक बहुत ही सुंदर समाधान हो प्रतीत नहीं होता है।

मुझे क्या जोड़ना है, इसलिए परिणाम में कोष्ठक शामिल नहीं हैं?

आपकी मदद के लिए धन्यवाद, आप लोग महान हैं! :)

+0

क्या आप कोष्ठक कॉल कर रहे हैं वास्तव में कोष्ठकों हैं। – JohnK

+2

संभावित डुप्लिकेट [PHP: ब्रांड्स के भीतर पाठ निकालने का सबसे अच्छा तरीका?] (Https://stackoverflow.com/questions/196520/php-best-way-to-extract-text-within-parenthesis) – EdChum

उत्तर

12

तुम सिर्फ अपने भाग निकले कोष्टक करने के लिए कोष्ठक पर कब्जा करने को जोड़ने के लिए, इसके अलावा में की जरूरत है।

<?php 
    $in = "hello (world), my name (is andrew) and my number is (845) 235-0184"; 
    preg_match_all('/\(([A-Za-z0-9 ]+?)\)/', $in, $out); 
    print_r($out[1]); 
?> 

यह आउटपुट:

Array ([0] => world [1] => is andrew [2] => 845) 
+0

आपके उत्तर के लिए धन्यवाद स्वीकार किया जाना चाहिए। यह बहुत अच्छा काम करता है (बच निकले बैकस्लाश के अलावा)। लेकिन ब्रैकेट कैसे मदद करते हैं? मैंने सोचा कि मेरी अभिव्यक्ति इस तरह पढ़ी गई थी: "एक खुला ब्रैकेट जिसके बाद अक्षरों, संख्याओं और रिक्त स्थान शामिल होते हैं, जिसके बाद एक बंद ब्रैकेट होता है"। यहां (गैर-भागने वाले) ब्रैकेट कैसे खेलते हैं? आपके सहयोग के लिए धन्यवाद! :) – Macks

+1

ओह, बच निकले बैकस्लाश के बारे में खेद है; अभी तय गैर-बच निकले ब्रैकेट का एक विशेष अर्थ है: कैप्चर करें। देखें, डिफ़ॉल्ट रूप से, पूरा मिलान '' [0] '' में कब्जा कर लिया जाता है, यही कारण है कि '' $ [0] '' में सब कुछ शामिल है, यहां तक ​​कि ब्रैकेट भी जिन्हें आप नहीं चाहते हैं। प्रत्येक ''() '' कैप्चर, ठीक है, _captures_ जो भी उनके बीच है, और उन्हें क्रमिक सरणी सूचकांक में संग्रहीत करता है, यानी '' [1] '', '' [2] '', '' [3] '' आदि।उदाहरण के लिए, यदि आपकी स्ट्रिंग "abc123def456" है और आपका रेगेक्स ''/abc (\ d +) (\ w +) (\ d) (\ d +)/'' है, तो आपके कैप्चर इस प्रकार होंगे: '1 [1] '' = "123", '' [2] '' = "def", '' [3] '' = "4", और '' 4] '' = "56"। –

+0

'preg_match'' और' preg_match_all'' के बीच का अंतर यह है कि बाद वाला नाम, जैसा कि नाम बताता है, सभी से मेल खाता है, ताकि सरणी के भीतर एक सरणी होगी: '' [1] = {"world" , "एंड्रू" है, "845"} ''। –

22

कोशिश:

preg_match('/\((.*?)\)/', $s, $a); 

उत्पादन:

Array 
(
    [0] => (hollow highlight) 
    [1] => hollow highlight 
) 
+0

आपके लिए धन्यवाद मदद! :) – Macks

+0

धन्यवाद यह मेरे लिए काम किया – itsandy

+0

आपने वास्तव में मेरा दिन बचाया :) – Hossein