29

2つの文字列の間のコンテンツを取得するための最良の方法は何ですか。

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を実行する方法ですか?

前もって感謝します!

4

7 に答える 7

49

これにはsubstrとstrposを使用することもできます。

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

FINDMEが見つからない場合を処理するには、エラーチェックを追加する必要があります。

于 2009-09-18T16:10:15.813 に答える
47
  • #代わりに使用/して、それらをエスケープする必要がないようにします。
  • 修飾子 sは改行を作成.し、\s改行も含めます。
  • {}の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を使用する必要があります。include/require は、オプションであってはなりません。
于 2009-09-18T16:11:14.203 に答える
5

私はこれらの2つのソリューションが大好きです

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 の単語数で確認)、両方の関数で約 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 />";
于 2014-02-15T22:30:22.820 に答える
1

改行は RegEx で問題を引き起こす可能性があります。処理する前に、改行を削除するか \n に置き換えてみてください。

于 2009-09-18T16:12:01.207 に答える
-1

すべてを 1 つの文字列にまとめる簡単な方法。

$newlines = array("\t","\n","\r","\x20\x20","\0","\x0B");
$one_string = str_replace($newlines, "", html_entity_decode($content));
于 2012-12-17T23:25:07.420 に答える