PHP: Parantez içindeki metin ayıklamak için en iyi yolu?

4 Cevap php

Parantez arasında metin kümesi ayıklamak için en iyi / en etkili yolu nedir? Ben mümkün olan en verimli şekilde "Bu (metin) dışındaki her şeyi görmezden" dizesinden dize "metin" olsun istedim söylüyorlar.

Şimdiye kadar, ben geldim iyi şudur:

$fullString = "ignore everything except this (text)";
$start = strpos('(', $fullString);
$end = strlen($fullString) - strpos(')', $fullString);

$shortString = substr($fullString, $start, $end);

Bunu yapmak için daha iyi bir yolu var mı? Ben regex az verimli olma eğilimindedir kullanarak genel olarak biliyorum, ama işlev çağrılarının sayısını azaltabilir sürece, belki de bu iyi bir yaklaşım olacaktır? Düşünceler?

4 Cevap

Ben sadece bir regex yapmak ve bunu atlatacaktı. Eğer büyük bir performans sorunu olur yeterince yineleme yapıyorsun sürece, bu kod sadece daha kolay (ve bunu geriye baktığımda anlıyorum)

$text = 'ignore everything except this (text)';
preg_match('#\((.*?)\)#', $text, $match);
print $match[1];

Yani, aslında, deftere kod çalışmaz: substr () 's parametreleri, $ string TL'den başlangıç ​​ve $length, ve strpos ()' s parametreleri $ samanlık, $ iğne bulunmaktadır. Biraz değiştirilmiş:

$str = "ignore everything except this (text)";
$start  = strpos($str, '(');
$end    = strpos($str, ')', $start + 1);
$length = $end - $start;
$result = substr($str, $start + 1, $length - 1);

Bazı incelikleri: I $ () ikinci parantez arama strpos yaparken PHP yardım etmek için ofset parametresi + 1 başlatmak kullanılır; biz $ bir başlangıç ​​ve maçtan parantez dışlamak için $ uzunluğu azaltmak artırmak.

Ayrıca, bu kodu kontrol hiçbir hata var: Eğer substr yapmadan önce emin $ başlangıç ​​ve bitiş $ yapmak === false yapmak isteyeceksiniz.

Regex karşı strpos / substr kullanarak gelince; performans-bilge, bu kod normal bir ifade eller aşağı yendi. Bu olsa biraz wordier bulunuyor. Ben yemek ve strpos / substr nefes, bu yüzden çok fazla bu umursamıyorum, ama bir başkası bir regex kompaktlığını tercih edebilir.

Normal bir ifade kullanabilirsiniz:

if( preg_match( '!\(([^\)]+)\)!', $text, $match ) )
    $text = $match[1];

Bu '[' ve ']' arasındaki tüm metin ayıklamak ve bunu 2 ayrı diziler (başka bir dizide bir dizi ve metin dışında parantez içinde parantez içinde yani metin) depolamak için bir örnek kod

   function extract_text($string)
   {
    $text_outside=array();
    $text_inside=array();
    $t="";
    for($i=0;$i<strlen($string);$i++)
    {
        if($string[$i]=='[')
        {
            $text_outside[]=$t;
            $t="";
            $t1="";
            $i++;
            while($string[$i]!=']')
            {
                $t1.=$string[$i];
                $i++;
            }
            $text_inside[] = $t1;

        }
        else {
            if($string[$i]!=']')
            $t.=$string[$i];
            else {
                continue;
            }

        }
    }
    if($t!="")
    $text_outside[]=$t;

    var_dump($text_outside);
    echo "\n\n";
    var_dump($text_inside);
  }

Output: extract_text("hello how are you?"); will produce:

array(1) {
  [0]=>
  string(18) "hello how are you?"
}

array(0) {
}

extract_text("hello [http://www.google.com/test.mp3] how are you?"); will produce

array(2) {
  [0]=>
  string(6) "hello "
  [1]=>
  string(13) " how are you?"
}


array(1) {
  [0]=>
  string(30) "http://www.google.com/test.mp3"
}