Regex Uzmanı - PHP etrafa

2 Cevap php

Düzenli ifadeler kesinlikle işe yaramaz değilim, ben senin yardımına takdir ediyorum.

Ben bu gibi, bir dize var:

$foo = 'Hello __("How are you") I am __("very good thank you")'

P: Ben lütfen garip bir dize olduğunu biliyorum, ama benimle kal

I need a regex expression that will look for the content between __("Look for content here") and put it in an array.

yani düzenli ifade "Nasılsın" bulmak ve "çok iyi teşekkür ederim" olur.

Çok teşekkürler.

2 Cevap

Bu deneyin:

preg_match_all('/(?<=__\(").*?(?="\))/s', $foo, $matches);
print_r($matches);

bu şu anlama gelir:

(?<=     # start positive look behind
  __\("  #   match the characters '__("'
)        # end positive look behind
.*?      # match any character and repeat it zero or more times, reluctantly
(?=      # start positive look ahead
  "\)    #   match the characters '")'
)        # end positive look ahead

EDIT

Ve Greg belirtildiği gibi: look-arounds ile çok tanıdık biri değil, onları dışarı bırakmak daha okunaklı olabilir. Daha sonra her şeyi karşılayan: __(", string ve ") ve string, {[(4)] maçları regex sarın }, yalnızca bu karakterleri yakalamak için iç parantez. Daha sonra eşleşmeleri $matches[1] olsa almak gerekir. Bir demo:

preg_match_all('/__\("(.*?)"\)/', $foo, $matches);
print_r($matches[1]);

Eğer Gumbo önerisini kullanmak istiyorsanız, kredi desen için ona gider:

$foo = 'Hello __("How are you")I am __("very good thank you")';

preg_match_all('/__\("([^"]*)"\)/', $foo, $matches);

Siz de tam dize sonuçları istediğiniz sürece sonuçlar için $matches[1] kullandığınızdan emin olun.

var_dump() ve $matches,

array
  0 => 
    array
      0 => string '__("How are you")' (length=16)
      1 => string '__("very good thank you")' (length=25)
  1 => 
    array
      0 => string 'How are you' (length=10)
      1 => string 'very good thank you' (length=19)