2011-06-17 6 views
2

<div id=”somevalue123” class=”text-block”></div>の間のすべてを置き換える正規表現を書くことはできますか?私はこれを行うことができますが、問題は、文字列内に他のdivノードがあることです。私はもちろん、ソースとしてHTMLファイルを渡していますdivの内容を正規表現に置き換えることはできますか?

public static function replaceStringBetween($start, $end, $new, $source, $limit = 1) 
{ 
    // Reinitialize the replacement count 
    self::$replacement_count = 0; 

    // Try to perform the replacement 
    $result = preg_replace('#('.preg_quote($start) . ')(.*)('.preg_quote($end) 
     . ')#is', '$1' . $new . '$3', $source, $limit, $count); 
    if ($count > 0) 
    { 
     self::$replacement_count++; 
     return $result; 
    } 

    // As a fallback, try again with a different method 
    $result = preg_replace ("#{$start}(.*){$end}#is", $new, $source, $limit, $count); 
    if ($count > 0) 
    { 
     self::$replacement_count++; 
     return $result; 
    } 

    // Return the original 
    return $source; 
} 

:ここ

は、私が使用している現在の正規表現です。 ありがとう

+4

適切なXMLパーサーを使用する方がよいでしょう。 –

答えて

0

正規表現では任意のネストをサポートできません。任意の入れ子のためのプッシュダウンオートマトン(パーサ)を検討することができます。

実際には、一連の正規表現を設計して、これらの固定数を解析することができます。しかし、いったんエラー状態を処理して(解析する)エラーになると、実際にはホーンの正規表現をパーサーの場所に入れようとしています。

これは、正規表現のbait-and-switchを使用して事実の後に置くのではなく、求めるモジュラリティでアプローチとデザインを再考する必要があるようです。

+2

現代の "正規表現"は、任意のネストされたものを完全にサポートすることができます。私はこれらの嘘が伝播するのを止めることを望む。 – tchrist

+0

私に例を教えてもらえますか?私は意図的に真実を伝えようとしていません。私は4年前に私の公式言語とオートマトンのクラスからこのことを覚えています。 –

+1

[こちらは例です](http://stackoverflow.com/questions/4840988/the-recognizing-power-of-modern-regexes/4843579#4843579)。 – tchrist

2

私が過去にこれを正確に行うために使った簡単なPHPパーサはSimple HTML DOM Parserです。セレクタdiv#somevalue123を使用します。

関連する問題