2014-11-22 7 views
9

Ich fand diese Funktion, die Daten zwischen zwei Strings Text, HTML oder was auch immer findet.Get String zwischen - Finden Sie alle Vorkommen PHP

Wie kann es geändert werden, damit es alle Vorkommen findet? Alle Daten zwischen jedem Auftreten von $ start [einige-zufällige-Daten] $ enden. Ich möchte alle [einige-zufällige-Daten] des Dokuments (Es wird immer andere Daten sein).

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

benötigen Sie Daten (String) Zähler Ihres Dokuments? –

+0

Um mehr zu erfassen, müssen Sie zu Regex wechseln. Siehe [preg_match_all] (http://php.net/manual/en/function.preg-match-all.php) – DarkBee

+0

Ich schaute auf preg_match_all, aber ich kann nicht herausfinden, wie man eine Regex macht. – user3778578

Antwort

22

Ein möglicher Ansatz:

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; 
} 

Verbrauch:

$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

Vielen Dank! Genau was ich wollte! – user3778578

+1

Du hast mein Leben gerettet, Kumpel! Oder zumindest viele Stunden testen und testen xP Vielen Dank so viel! :) –

7

Sie können diese mit regex tun:

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

das ist gut für Standard-Strings, aber schlecht für Dinge wie Dollarzeichen und Karotten als Trennzeichen verwenden, weil es Regex vermasselt –

0

Ich musste auch den Text außerhalb des Musters. Also änderte ich die Antwort von raina77ow oben etwas:

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; 
} 

Verbrauch:

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

gibt:

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

Ich musste all diese Vorkommnisse zwischen spezifischen ersten und letzten Tag finden und ändere sie irgendwie und nimm die geänderte Saite zurück.

Also fügte ich diesen kleinen Code zu raina77ow Ansatz nach der Funktion hinzu.

 $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; 

Jetzt Ausgangsprobe wurde gelöscht Tags und alle Strings zwischen ihnen hat Zahl wie folgt hinzugefügt:

One-1 aaa TwoTwo-2 Drei Vier-3 aaaaa Fünf-4

Aber man kann Mach was auch immer mit ihnen. Vielleicht könnte es für jemanden hilfreich sein.

2

Ich liebe zu explodieren, um Zeichenfolge zwischen zwei Zeichenfolge zu erhalten. Diese Funktion funktioniert auch für mehrere Vorkommen.

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; 
} 
Verwandte Themen