wake-up-neo.com

Holen Sie sich Inhalte zwischen zwei Zeichenfolgen PHP

Was ist der beste Weg, um den Inhalt zwischen zwei Zeichenketten zu erhalten, z.

ob_start();
include('externalfile.html'); ## see below
$out = ob_get_contents();
ob_end_clean();

preg_match('/{FINDME}(.|\n*)+{\/FINDME}/',$out,$matches);
$match = $matches[0];

echo $match;

## I have used .|\n* as it needs to check for new lines. Is this correct?

## externalfile.html

{FINDME}
Text Here
{/FINDME}

Aus irgendeinem Grund scheint dies an einer Stelle in meinem Code zu funktionieren und nicht an einer anderen. Mache ich das richtig? Oder gibt es einen besseren Weg?

Ist auch der Ausgabepuffer der Weg dazu oder file_get_contents?

Danke im Voraus!

20
Lizard
  • Verwenden Sie # anstelle von /, damit Sie sie nicht entgehen müssen.
  • Der modifiers bewirkt, dass . und \s auch Zeilenumbrüche enthalten.
  • { und } verfügen über verschiedene Funktionen, z. B. von n bis m mal in {n,m}.
  • Das grundlegende

    preg_match('#\\{FINDME\\}(.+)\\{/FINDME\\}#s',$out,$matches);
    
  • Das für diverse Tags erweiterte etc (Styling ist nicht so schön durch das Javascript).

    $delimiter = '#';
    $startTag = '{FINDME}';
    $endTag = '{/FINDME}';
    $regex = $delimiter . preg_quote($startTag, $delimiter) 
                        . '(.*?)' 
                        . preg_quote($endTag, $delimiter) 
                        . $delimiter 
                        . 's';
    preg_match($regex,$out,$matches);
    

Fügen Sie diesen Code in eine Funktion ein

  • Für jede Datei, die keinen stray php - Code ausführen soll, sollten Sie file_get_contents verwenden. Include/Request sollte dort nicht einmal eine Option sein.
39
OIS

Sie können auch substr und strpos verwenden.

$startsAt = strpos($out, "{FINDME}") + strlen("{FINDME}");
$endsAt = strpos($out, "{/FINDME}", $startsAt);
$result = substr($out, $startsAt, $endsAt - $startsAt);

Sie müssen eine Fehlerprüfung hinzufügen, um den Fall zu behandeln, in dem FINDME nicht auftritt.

40
Adam Wright

Ich liebe diese beiden Lösungen

function GetBetween($content,$start,$end)
{
    $r = explode($start, $content);
    if (isset($r[1])){
        $r = explode($end, $r[1]);
        return $r[0];
    }
    return '';
}


function get_string_between($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);
}

Ich habe auch einige Benchmarks mit beiden oben genannten Lösungen gemacht und beide geben fast die gleiche Zeit. Sie können es auch testen. Ich gab beiden Funktionen eine zu lesende Datei, die etwa 60000 Zeichen enthielt (überprüft mit der Anzahl der Wörter von Frau Word), und beide Funktionen führten zu einer Suche nach etwa 0,000999 Sekunden.

$startTime = microtime(true);
GetBetween($str, '<start>', '<end>');
echo "Explodin Function took: ".(microtime(true) - $startTime) . " to finish<br />";

$startTime = microtime(true);
get_string_between($str, '<start>', '<end>');
echo "Subsring Function took: ".(microtime(true) - $startTime) . " to finish<br />";
4

Ich vermeide, wenn möglich, die Verwendung von Regex. Hier ist eine alternative Lösung, um alle Zeichenfolgen zwischen zwei Zeichenfolgen abzurufen und ein Array zurückzugeben.

function getBetween($content, $start, $end) {
    $n = explode($start, $content);
    $result = Array();
    foreach ($n as $val) {
        $pos = strpos($val, $end);
        if ($pos !== false) {
            $result[] = substr($val, 0, $pos);
        }
    }
    return $result;
}
print_r(getBetween("The quick brown {{fox}} jumps over the lazy {{dog}}", "{{", "}}"));

Ergebnisse :

Array
(
    [0] => fox
    [1] => dog
)
1
Donovan P

Zeilenumbrüche können zu Problemen in RegEx führen. Versuchen Sie, diese zu entfernen oder durch\n zu ersetzen, bevor Sie mit der Verarbeitung beginnen.

1
Cem Kalyoncu

Dies ist eine PHP -Lösung, die die Zeichenfolgen zurückgibt, die zwischen den Tags in einem Heuhaufen gefunden werden. Es funktioniert, aber ich habe nicht auf Effizienz getestet. Ich brauchte das und wurde von Adam Wrights Antwort auf dieser Seite inspiriert.

Gibt ein Array () zurück, das alle Zeichenfolgen enthält, die zwischen $ tag und $ end_symbold. $ Tag in $ haystack gefunden wurden, oder FALSE, wenn kein $ end_symbol. $ Tag gefunden wurde, sodass im $ haystack kein Tag-Paar vorhanden ist.

function str_between_tags($haystack, $tag, $end_symbol){
    $c_end_tags = substr_count($haystack, $end_symbol.$tag);
    if(!$c_end_tags) return FALSE;

    for($i=0; $i<$c_end_tags; $i++){
        $p_s = strpos($haystack, $tag, (($p_e)?$p_e+strlen($end_symbol.$tag):NULL) ) + strlen($tag );
        $p_e = strpos($haystack, $end_symbol.$tag, $p_s);
        $result[] = substr($haystack, $p_s, $p_e - $p_s);
    }
    return $result;
}
0
dalv lexa
function getInbetweenStrings($start, $end, $str){
    $matches = array();
    $regex = "/$start([a-zA-Z0-9_]*)$end/";
    preg_match_all($regex, $str, $matches);
    return $matches[1];
}


$str = "C://@@[email protected]@/@@[email protected]@/@@[email protected]@";
$str_arr = getInbetweenStrings('@@', '@@', $str);

print_r($str_arr);
0
Ravi Verma