İki dizeleri PHP arasında içerik alın

5 Cevap php

Nedir iki dizeleri örneğin arasındaki içeriğini elde etmek için en iyi yoldur

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}

Nedense bu başka benim kod tek bir yerde çalışmak için değil ve görünür. Ben doğru bir şekilde bu konuda gidiyorum? Ya da daha iyi bir yolu var mı?

Ayrıca çıkış tamponu bu ya file_get_contents yapmak için bir yoldur?

Şimdiden teşekkürler!

5 Cevap

  • # yerine / bu yüzden onları kaçmak zorunda değilsin kullanın.
  • modifier s . ve \s, aynı zamanda yeni satır bulunmaktadır hale getirir.
  • { ve }-N gelen m kere gibi çeşitli işlevleri vardır {n,m}.
  • Temel

    preg_match('#\\{FINDME\\}(.+)\\{/FINDME\\}#s',$out,$matches);
    
  • Çeşitli etiketleri vb (styling javascript kadar güzel değil) için gelişmiş.

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

Bir işlevi bu kodu koy

  • Eğer herhangi bir stray php kodu execue istemediğiniz herhangi bir dosya için, file_get_contents kullanmalısınız. include / Hatta orada bir seçenek olmamalı gerektirir.

Siz de bunun için substr ve strpos kullanabilirsiniz.

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

Bunu FindMe gelmez davayı işlemek için hata denetimi eklemeniz gerekir.

Satır sonları, RegEx'in sorunlara neden kaldırılması veya \ n işleme önce onları yerine deneyebilirsiniz.

Ben bu iki çözüm seviyorum

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

Ben de yukarıda çözümleri ve de hemen hemen aynı zaman veriyoruz hem de bazı kriterleri yaptı. Siz de test edebilirsiniz. Ben hem fonksiyonları (Bayan Word kelime sayısı ile gözden) yaklaşık 60000 karakterler vardı ve hem de işlevleri bulmak için yaklaşık 0,000999 saniyede sonuçlandı okumak için bir dosya verdi.

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

Bir dize içine her şeyi koymak için hızlı bir yoldur.

$newlines = array("\t","\n","\r","\x20\x20","\0","\x0B");
$one_string = str_replace($newlines, "", html_entity_decode($content));