سؤال

ما هي أفضل طريقة للحصول على المحتوى بين سلسلتين على سبيل المثال؟

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}

لسبب ما يبدو أن هذا يعمل في مكان واحد في الكود الخاص بي وليس في مكان آخر.هل سأقوم بهذا الأمر بالطريقة الصحيحة؟او هل هناك طريقه افضل؟

هل يعتبر المخزن المؤقت للإخراج أيضًا هو الطريقة للقيام بذلك أم file_get_contents؟

شكرا لك مقدما!

هل كانت مفيدة؟

المحلول

  • يستخدم # بدلاً من / لذلك لم يكن لديك للهروب منهم.
  • ال المعدل s يصنع . و \s تتضمن أيضًا أسطرًا جديدة.
  • { و } لديه وظائف مختلفة مثل من n إلى m مرات في {n,m}.
  • الأساسية

    preg_match('#\\{FINDME\\}(.+)\\{/FINDME\\}#s',$out,$matches);
    
  • المتقدمة لمختلف العلامات وما إلى ذلك (التصميم ليس لطيفًا جدًا بواسطة جافا سكريبت).

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

ضع هذا الكود في دالة

  • لأي ملف لا تريد تنفيذه طائشة كود php، يجب عليك استخدام file_get_contents.include/require لا ينبغي أن يكون خيارًا هناك.

نصائح أخرى

ويمكنك كذلك استخدام SUBSTR وstrpos لذلك.

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

وستحتاج إلى إضافة خطأ التحقق لمعالجة الحالة حيث أنه لا FINDME.

وأحب هذين الحلين

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

وأنا أيضا مؤشرات قليلة، وكذلك مع كل من الحلول المذكورة أعلاه وكلاهما يعطي نفس الوقت تقريبا. يمكنك اختبار ذلك أيضا. أعطى كل من وظائف ملف لقراءة الذي كان حوالي 60000 حرفا (استعرض مع العد كلمة السيدة وورد)، وأدى كل من وظائف في حوالي 0.000999 ثانية لتجد.

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

وفواصل الأسطر يمكن أن يسبب مشاكل في التعابير المنطقية، حاول إزالة أو استبدالها \ ن قبل المعالجة.

وأود أن تجنب استخدام التعابير المنطقية إذا أمكن، وهنا هو حل بديل لجلب كافة السلاسل بين سلسلتين وإرجاع صفيف.

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}}", "{{", "}}"));

والنتائج:

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

وهذا هو الحل PHP وترجع السلاسل وجدت بين العلامات في كومة قش. كان يعمل، ولكن أنا لم تختبر من الكفاءة. أنا بحاجة إلى هذا وكانت مستوحاة من الإجابة آدم رايت على هذه الصفحة.

وإرجاع مجموعة () التي تحتوي على كافة السلاسل وجدت بين $ العلامة و$ end_symbold. العلامة $ في $ كومة قش، أو FALSE إذا لم يكن $ end_symbol. تم العثور $ العلامة وبالتالي عدم وجود بطاقة الزوج في $ كومة قش.

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

وسيلة سريعة لوضع كل شيء في سلسلة واحدة.

$newlines = array("\t","\n","\r","\x20\x20","\0","\x0B");
$one_string = str_replace($newlines, "", html_entity_decode($content));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top