문제

두 줄 사이의 내용을 얻는 가장 좋은 방법은 무엇입니까?

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 Newlines도 포함하십시오.
  • { 그리고 } N에서 M 회과 같은 다양한 기능이 있습니다. {n,m}.
  • 기본

    preg_match('#\\{FINDME\\}(.+)\\{/FINDME\\}#s',$out,$matches);
    
  • 다양한 태그 등의 고급 (스타일링은 JavaScript에 의해 그리 좋지 않습니다).

    $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를 사용해야합니다. 포함/요구 사항은 옵션이어서는 안됩니다.

다른 팁

이것을 위해 substr과 strpos를 사용할 수도 있습니다.

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

사례를 찾지 못하는 경우 오류 확인을 추가해야합니다.

나는이 두 솔루션을 좋아합니다

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 자 (Ms. Word의 Word Count로 검토 됨)를 가진 파일을 읽었으며 두 기능 모두 약 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 />";

라인 브레이크는 REGEX에 문제를 일으킬 수 있으며 처리하기 전에 n으로 제거하거나 교체하십시오.

가능한 경우 Regex를 사용하지 않기를 원합니다. 여기에는 두 줄 사이의 모든 문자열을 가져오고 배열을 반환하는 대체 솔루션이 있습니다.

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 솔루션입니다. 작동하지만 효율성을 테스트하지 않았습니다. 나는 이것을 필요로 했고이 페이지에서 Adam Wright의 답변에서 영감을 받았습니다.

$ tag와 $ end_symbold. $ tag 사이에있는 모든 문자열이 포함 된 배열 ()을 $ haystack에 또는 $ end_symbol이없는 경우 false를 반환합니다. $ tag가 발견되지 않았으므로 $ haystack에는 태그 쌍이 존재하지 않습니다.

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