1

私はこれまでスタックオーバーフローからこれまでに約10の異なるソリューションのバリエーションを読んで実装しようとしましたが、どれも機能していません。私がやりたいのは、2つのpreタグ(タグ自体を含む)の間のコンテンツを置き換えることだけです。正規表現なのか、まっすぐなphpなのかは関係ありません。誰か提案がありますか?

例は次のとおりです。

This is how to remove pre tags and their contents:<br/>

<pre>
<?php>
[code here]
<?php>

That's all there is to it.

になります:

This is how to remove pre tags and their contents:</br>
That's all there is to it.

これは、htmlがページにレンダリングされる前に発生する必要があります。

DOMDocumentが機能するかどうかはわかりません。私のコードのコンテキストは、式エンジンのプラグイン(codeigniter / phpベースのCMS)内で発生しているということです。プラグインはhtmlを設定された文字長に切り捨て、それを親テンプレートにレンダリングしてブラウザでレンダリングします-したがって、domdocumentはブラウザにレンダリングできません-コードを親テンプレートに返す必要がありますタグとコンテンツが削除されました。

4

2 に答える 2

2

使用DOMDocument:

$html = '<div id="container">
    <div id="test"></div>
    <pre>
        content
    </pre>
</div>';

$dom = new DOMDocument;
$dom->loadXML($html);

$xpath = new DOMXPath($dom);
$query = '//div[@id="container"]/pre';
// $query = '//pre'; // for all <pre>
$entries = $xpath->query($query);

foreach($entries as $one){
    $newelement = $dom->createTextNode('Some new node!'); 
    $one->parentNode->replaceChild($newelement, $one);
}

echo $dom->saveHTML();

コードパッドの例

于 2012-09-28T19:13:23.187 に答える
2

アサーション (つまり、先読み/後読み) を使用する場合、正規表現は正常に機能します。これにより、pre タグ内のすべてが削除されます。

$page_content = preg_replace('/<(pre)(?:(?!<\/\1).)*?<\/\1>/s','',$page_content);

他のタグを含めたい場合は、次のように最初の一致グループに追加するだけです:

(pre|script|style)

正規表現タグの削除に関する唯一の問題は、次のような同じタイプのネストされたタグです。

<div>
    <div>inner closing tag might match beginning outer opening div tag leaving an orphan outer closing tag</div>
<div>

編集

私はあなたが他の答えの他のコメントに残した例をテストしましたが、私にとってはうまくいきます:

$html = 'This is a quick snippet that often comes in handy: <pre>[code]blah blah[/code]</pre>';
$html = preg_replace('/<(pre)(?:(?!<\/?\1).)*?<\/\1>/s',"",$html);
var_dump($html);

結果:

string(51) "This is a quick snippet that often comes in handy: "
于 2012-09-28T19:15:06.743 に答える