2014-11-22 26 views
9

İki metin dizesi, html veya her neyse arasında veri bu işlevi buldum.Dize ara - Tüm oluşumları bul PHP

Tüm oluşumları bulabilmesi için nasıl değiştirilir? Her başlangıç ​​$ başlangıç ​​[bazı rastgele veri] $ sonu arasındaki her veri. Belgenin tüm [rasgele-verileri] olmasını istiyorum (Her zaman farklı veriler olacaktır).

function getStringBetween($string, $start, $end) { 
    $string = " ".$string; 
    $ini = strpos($string,$start); 
    if ($ini == 0) return ""; 
    $ini += strlen($start); 
    $len = strpos($string,$end,$ini) - $ini; 
    return substr($string,$ini,$len); 
} 
+0

Belgenizin veri (dize) sayacına ihtiyacınız var mı? –

+0

Daha fazla yakalamak için regex'e devam etmeniz gerekir. Bkz. [Preg_match_all] (http://php.net/manual/en/function.preg-match-all.php) – DarkBee

+0

Preg_match_all'a baktım, ancak bir düzenli ifadeyi nasıl yapacağımı anlayamıyorum. – user3778578

cevap

22

Olası bir yaklaşım:

function getContents($str, $startDelimiter, $endDelimiter) { 
    $contents = array(); 
    $startDelimiterLength = strlen($startDelimiter); 
    $endDelimiterLength = strlen($endDelimiter); 
    $startFrom = $contentStart = $contentEnd = 0; 
    while (false !== ($contentStart = strpos($str, $startDelimiter, $startFrom))) { 
    $contentStart += $startDelimiterLength; 
    $contentEnd = strpos($str, $endDelimiter, $contentStart); 
    if (false === $contentEnd) { 
     break; 
    } 
    $contents[] = substr($str, $contentStart, $contentEnd - $contentStart); 
    $startFrom = $contentEnd + $endDelimiterLength; 
    } 

    return $contents; 
} 

Kullanımı:

$sample = '<start>One<end>aaa<start>TwoTwo<end>Three<start>Four<end><start>Five<end>'; 
print_r(getContents($sample, '<start>', '<end>')); 
/* 
Array 
(
    [0] => One 
    [1] => TwoTwo 
    [2] => Four 
    [3] => Five 
) 
*/ 

Demo.

+1

Çok teşekkür ederim! Sadece istediğim şey! – user3778578

+1

Hayatımı kurtardın dostum! Ya da en azından birkaç saat süren test ve tekrar test xP Size çok teşekkür ederiz! :) –

7

Bunu kullanarak regex yapabilirsiniz:

function getStringsBetween($string, $start, $end) 
{ 
    $pattern = sprintf(
     '/%s(.*?)%s/', 
     preg_quote($start), 
     preg_quote($end) 
    ); 
    preg_match_all($pattern, $string, $matches); 

    return $matches[1]; 
} 
+0

bu standart dizgiler için iyidir ama dolar işareti ve havuçları sınırlayıcı olarak kullanmak gibi şeyler için kötü çünkü düzenli ifadeleri karıştırıyor –

0

Ayrıca biçiminin dışında metni gerekli.

function get_delimited_strings($str, $startDelimiter, $endDelimiter) { 
    $contents = array(); 
    $startDelimiterLength = strlen($startDelimiter); 
    $endDelimiterLength = strlen($endDelimiter); 
    $startFrom = $contentStart = $contentEnd = $outStart = $outEnd = 0; 
    while (false !== ($contentStart = strpos($str, $startDelimiter, $startFrom))) { 
     $contentStart += $startDelimiterLength; 
     $contentEnd = strpos($str, $endDelimiter, $contentStart); 
     $outEnd = $contentStart - 1; 
     if (false === $contentEnd) { 
      break; 
     } 
     $contents['in'][] = substr($str, $contentStart, $contentEnd - $contentStart); 
     $contents['out'][] = substr($str, $outStart, $outEnd - $outStart); 
     $startFrom = $contentEnd + $endDelimiterLength; 
     $outStart = $startFrom; 
    } 
    $contents['out'][] = substr($str, $outStart, $contentEnd - $outStart); 
    return $contents; 
} 

Kullanımı:

$str = "Bore layer thickness [2 mm] instead of [1,25 mm] with [0,1 mm] deviation."; 
    $cas = get_delimited_strings($str, "[", "]"); 

verir: Bu yüzden biraz yukarıda raina77ow cevabını değiştirdi

array(2) { 
    ["in"]=> array(3) { 
     [0]=> string(4) "2 mm" 
     [1]=> string(7) "1,25 mm" 
     [2]=> string(6) "0,1 mm" 
    } 
    ["out"]=> array(4) { 
     [0]=> string(21) "Bore layer thickness " 
     [1]=> string(12) " instead of " 
     [2]=> string(6) " with " 
     [3]=> string(10) " deviation" 
    } 
} 
1

Belirli ilk ve son etiketi arasındaki tüm bu oluşumları bulmak için gerekli onları bir şekilde değiştir ve değiştirilmiş dizgiyi geri al.

Bu küçük kodu, fonksiyondan sonra raina77ow yaklaşımına ekledim.

Tek 1 aaa twotwo-2 Üç Dört-3 aaaaa Beş-4

Ama şunları yapabilirsiniz:

 $sample = '<start>One<end> aaa <start>TwoTwo<end> Three <start>Four<end> aaaaa <start>Five<end>'; 
     $sample_temp = getContents($sample, '<start>', '<end>'); 
     $i = 1; 
     foreach($sample_temp as $value) { 
      $value2 = $value.'-'.$i; //there you can change the variable 
      $sample=str_replace('<start>'.$value.'<end>',$value2,$sample); 
      $i = ++$i; 
     } 
     echo $sample; 

Şimdi çıkış örneği sildi etiketleri ve aralarındaki tüm dizeleri böyle numarayı ekledi Onlarla başka ne yaparsan yap. Belki birisi için yararlı olabilir.

2

İki dizge arasında ip almak için patlamayı kullanmayı seviyorum. Bu işlev aynı zamanda çoklu oluşumlar için de çalışır.

function GetIn($str,$start,$end){ 
    $p1 = explode($start,$str); 
    for($i=1;$i<count($p1);$i++){ 
     $p2 = explode($end,$p1[$i]); 
     $p[] = $p2[0]; 
    } 
    return $p; 
}