Frage

Was ist der beste Weg, um den Inhalt zwischen zwei Strings beispielen zu erhalten.

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 auf einem Platz in meinem Code zu arbeiten und andere nicht. Werde ich über diese in der richtigen Art und Weise? Oder gibt es einen besseren Weg?

Auch ausgegeben, um die Art und Weise puffern diese oder file_get_contents zu tun?

Vielen Dank im Voraus!

War es hilfreich?

Lösung

  • Verwenden Sie # statt /, so dass Sie entkommen müssen sie nicht.
  • Die Modifikator s macht . und \s auch umfassen Zeilenumbrüche.
  • { und } verfügt über verschiedene Funktionen, wie von n bis m-mal in {n,m}.
  • Der Grund

    preg_match('#\\{FINDME\\}(.+)\\{/FINDME\\}#s',$out,$matches);
    
  • Die hoch entwickelte für verschiedene Umbauten usw. (Styling ist durch die Javascript nicht so schön).

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

Setzen Sie diesen Code in einer Funktion

  • Für jede Datei, die Sie wollen nicht Streu PHP-Code execue, sollten Sie file_get_contents verwenden. include / erfordern sollte es nicht einmal eine Option sein.

Andere Tipps

Sie können auch substr und strpos für diese.

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

Sie müssen hinzufügen Fehlerprüfung, den Fall zu behandeln, in denen dies nicht der Fall FindMe.

Ich liebe diese zwei 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 als auch mit beiden Lösungen, die oben und beide sind fast die gleiche Zeit. Sie können es auch testen. Ich habe eine Datei, beiden Funktionen zu lesen, die etwa 60.000 Zeichen (Bewertung mit Frau Word Wortanzahl) hatte und beide Funktionen führten zu etwa 0,000999 Sekunden zu finden.

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

Zeilenumbrüche können Probleme in RegEx verursachen, versuchen zu entfernen oder sie mit \ n vor der Verarbeitung zu ersetzen.

Ich mag mit regex zu vermeiden, wenn möglich, hier alternative Lösung ist, alle Strings zwischen zwei Strings zu holen und gibt ein Array.

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
)
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://@@ad_custom_attr1@@/@@upn@@/@@samaccountname@@";
$str_arr = getInbetweenStrings('@@', '@@', $str);

print_r($str_arr);

Dies ist eine PHP-Lösung, die die Fäden zwischen den Tags im Heuhaufen gefunden zurück. Es funktioniert, aber ich habe nicht auf seine Effizienz geprüft. Ich brauchte diese und wurde von Adam Wright Antwort auf dieser Seite inspiriert.

Gibt einen Array (), die alle Fäden zwischen $ tag und $ end_symbold. $ Tag in $ Heuhaufen gefunden oder FALSE, wenn kein $ end_symbol. $ Tag daher keinen Tag gefunden wurde Paar existiert im $ Heuhaufen.

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

Schnell Art und Weise alles in einen String zu setzen.

$newlines = array("\t","\n","\r","\x20\x20","\0","\x0B");
$one_string = str_replace($newlines, "", html_entity_decode($content));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top