0
function getContent($xml,$tag,$id="") {
    if ($id=="") {
        $tag_regex = '/<'.$tag.'[^>]*>(.*?)<\/'.$tag.'>/si';
    } else {
        $tag_regex = '/<'.$tag.'[^>]*id=[\'"]'.$id.'[\'"]>(.*?)<\/'.$tag.'>/si';
    }
    preg_match($tag_regex,$xml,$matches);
    return $matches[1];
}

$omg = file_get_contents("Generated/index.php");
$extract = getContent($omg,"div","lolz2");
echo $extract;

たとえば、私はこのようなものを持っています。そしてhtmlには次のようなものがあります:

<div id="lolz">qwg1eqwe</div>
<div id="lolz1"><div id='lolz2'>qwdqw2cq</div>asd3qwe</div>

id lolz を検索すると正しい答えが得られますが、 lolz1 を検索すると最初は inner で止まり</div>ます<div id="lolz2"><div>preg_matchのカウンターのようなものを保持することは可能</div>です。

4

1 に答える 1

1

HTML は通常の言語ではないため、そのようなものを作成するのはやり過ぎであり、HTML パーサーの仕事です。参照してください: XHTML 自己完結型タグを除く RegEx マッチ オープン タグ.

ただし、コードが失敗した理由は、入力に一重引用符と二重引用符の両方を使用していたが、正規表現がそれを考慮していなかったためです。これは私のために働く:

function getContent($xml,$tag,$id="") {
    if ($id=="") {
        $tag_regex = '/<'.$tag.'[^>]*>(.*?)<\/'.$tag.'>/si';
    } else {
        $tag_regex = '/<'.$tag.'[^>]*id=[\\\'"]'.$id.'[\\\'"]>(.*?)<\/'.$tag.'>/si';;
    }
    preg_match($tag_regex,$xml,$matches);
    return $matches[1];
}

$omg = '<div id="lolz">qwg1eqwe</div>
<div id="lolz1"><div id="lolz2">qwdqw2cq</div>asd3qwe</div>';
$extract = getContent($omg,"div","lolz2");
var_dump($extract);

入れ子になった要素がない限り、このコードは機能し、DOM パーサーを使用する必要はありませんが、入れ子になっている可能性のあるより複雑なもの(たとえば、入力を制御できない)については実際に使用する必要があります。 .

于 2013-02-17T14:16:19.987 に答える