2017-08-30 21 views
2

2つの部分文字列の間に部分文字列を抽出します。問題は最初のものだけを抽出することです。私はすべての文書でそれをやりたい。2つの部分文字列の間で部分文字列を取得する方法は?

例:

function getBetween($content,$start,$end){ 
    $r = explode($start, $content); 
    if (isset($r[1])){ 
     $r = explode($end, $r[1]); 
     return $r[0]; 
    } 
    return ''; 
} 

$document = '<a data-id="777777"></a><a data-id="888888"></a><a data-id="99999"></a>'; 
$content = $document; 
$start = '<a data-id="'; 
$end = '"'; 
$data = getBetween($content,$start,$end); 
echo $data; 

$document2 = '<a data-A="AAAAAA"></a><a data-A="BBBBBB"></a><a data-A="CCCCCC"></a>'; 
$content = $document2; 
$start = '<a data-A="'; 
$end = '"'; 
$data2 = getBetween($content,$start,$end); 
echo $data2; 

今では唯一の777777AAAAAを抽出しています。しかし、私がしたいことはある777777AAAAAA888888BBBBBB999999CCCCC

+0

使用http://php.net/manual/en/function.preg-match-all.php – Neodan

+0

は、私はいくつかのトラブルにこれをやってました。この結果を達成する別の方法がありますか? – user1708580

答えて

2

だけpreg_match_all機能を使用します。

は、これは大きな$end文字列ができるようになりますわずかに遅いパターン/ preg_match()呼び出しです。

例:

<?php 
$document = '<a data-id="777777"></a><a data-id="888888"></a><a data-id="99999"></a>'; 
$document2 = '<a data-A="AAAAAA"></a><a data-A="BBBBBB"></a><a data-A="CCCCCC"></a>'; 

$list1 = []; 
$list2 = []; 
preg_match_all('/<a data-id="([^"]+)"/', $document, $list1); 
preg_match_all('/<a data-A="([^"]+)"/', $document2, $list2); 
print_r([$list1, $list2]); 
2

コード:(Demo

function getBetween($content,$start,$end){ 
    return preg_match_all('/'.preg_quote($start,'/').'\K[^'.preg_quote($end,'/').']*(?='.preg_quote($end,'/').')/',$content,$out)?$out[0]:''; 
} 


$document = '<a data-id="777777"></a><a data-id="888888"></a><a data-id="99999"></a>'; 
$content = $document; 
$start = '<a data-id="'; 
$end = '"'; 
$data = getBetween($content,$start,$end); 
var_export($data); 

$document2 = '<a data-A="AAAAAA"></a><a data-A="BBBBBB"></a><a data-A="CCCCCC"></a>'; 
$content = $document2; 
$start = '<a data-A="'; 
$end = '"'; 
$data2 = getBetween($content,$start,$end); 
var_export($data2); 

出力:

私の方法は効果的にこのパターン生成
array (
    0 => '777777', 
    1 => '888888', 
    2 => '99999', 
)array (
    0 => 'AAAAAA', 
    1 => 'BBBBBB', 
    2 => 'CCCCCC', 
) 

/<a data-id="\K[^"]*(?=")/として所望の部分文字列を返します。フルストリングマッチこのパターンは、キャプチャグループがないため、より少ないステップで実行するだけでなく、より小さな結果配列を返します。 Pattern Demo Link

preg_quote()は、変数パターンが「中断」しないように、すべての必要な文字をエスケープするために使用されます。

$endは、パターンに2回使用された - かつて「否定文字クラス」[^"]で、ちょうどレコードの「肯定先読み」(?=")

で二回目:

  • /"([^"]*)"/ますサンプル入力を処理します。など

*重要、DOMDOCUMENT私のパターンは、単一の文字として$endを処理するために構築されています:

  • のHTML文字列を処理する、HTMLパーサを使用することをお勧めします。複数の文字である場合、パターンは期待通りに機能せず、変更する必要があります。 (Pattern Demo

    preg_match_all('/'.preg_quote($start,'/').'\K.*?(?='.preg_quote($end,'/').')/',$content,$out)?$out[0]:''; 
    
  • +0

    お返事ありがとうございました – user1708580

    +1

    あなたも大歓迎です。私は、堅牢で最適化された解答を説明してくれることをうれしく思います。将来他の人に役立つでしょう。 – mickmackusa