2012-06-28 34 views
7

Bu çok basit bir sorundur, ancak hiçbir yerde bir çözüm bulamadım.PHP/REGEX: Parantez içinde bir ip alın

Parantez içinde , ancak parantez olmadan bir dize almak için preg_match veya preg_match_all kullanmayı deneyin.

Şimdiye kadar, benim ifade şöyle görünür:

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

ve aşağıdaki sonucu verir:

3 (içi boş vurgulamak) 928-129 (< - orijinal dize)

(içi boş vurgu) (< - sonuç)

İstediğim, parantez içindeki dizedir, ancak parantez içermez. Muhtemelen str_replace falan sonradan parantez yerini alabilecek

içi boş vurgulamak, ama bu benim için çok şık çözüm olarak görünmüyor: Bu gibi görünürdü.

Ne eklemek zorundayım, bu nedenle parantez sonuçta yer almıyor mu?

Yardımlarınız için teşekkürler, çocuklar harikasınız! :)

+0

Eğer parantez aradığınız ne aslında parantez vardır. – JohnK

+2

Olası çoğaltılabilir [PHP: Parantez içinde metin ayıklamanın en iyi yolu] (https://stackoverflow.com/questions/196520/php-best-way-to-extract-text-within-parenthesis) – EdChum

cevap

12

Sadece kendi kaçan parantez ek olarak, parantez yakalama eklemeniz gerekir.

<?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]); 
?> 

Bu çıkışlar:

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

Cevabınız için teşekkür ederiz. Bu harika çalışıyor (kaçan backslashes dışında). Ancak parantez nasıl yardımcı olur? İfademin şu şekilde okunduğunu düşündüm: "açık bir parantezin ardından harflerden, sayılardan ve boşluklardan oluşan ardı ardına gelen kapalı bir parantezin takip ettiği". (Kaçınılmaz) parantezler burada nasıl devreye giriyor? Yardımın için teşekkürler! :) – Macks

+1

Oops, kaçan backslashes için üzgünüm; şimdi düzeltildi. Kaçak olmayan parantezlerin özel bir anlamı vardır: yakalama. Varsayılan olarak, tüm eşleşmenin '' [0] '' içine çekilmesi, bu yüzden '' $ out [0] '', her şeyi, hatta istemediğiniz köşeli parantezleri içerir. Her '' ('' '' '' '' '' '' yakalama, iyi, _captures_ aralarındaki her neyse, ve bunları sıralı dizi indekslerinde saklar, yani '' [1] '', '' [2] '', [3] ', vb.Örneğin, dizginiz "abc123def456" ise ve ifadeniz ''/abc (\ d +) (\ w +) (\ d) (\ d +)/'' ise, yakalamanız şöyle olurdu: '' [1] '' = “123”, '' [2] '', '' def '', '' [3] '' = '' '' ve '' [4] '' = '56'. –

+0

'' preg_match'' ve '' preg_match_all'' arasındaki fark, ikincisinin, adından da anlaşılacağı gibi, hepsi ile eşleşmesidir, böylece dizi içinde bir dizi olacak: '' [1] = {"world" , "andrew", "845"} ''. –

22

deneyin:

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

çıkışı:

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

yardım et! :) – Macks

+0

teşekkürler bu benim için çalıştı – itsandy

+0

Gerçekten benim gün kurtardı :) – Hossein

İlgili konular