2016-11-01 8 views
4

更新された質問、残念ながら私は直前に説明しませんでした。2つの特定のタグの間の文字列を変更する - ph

詳細:

私は複数の行を使用してデータベースを持っており、各行は、データのトンを持っていますが、どのような各データが共通に持っていることは、ランダムな順序で<pre><code></code></pre>タグです。

例:

$string = " 
    <h2>Heading 2</h2> 
    Something 
     <pre><code> alot of html and other code here </code></pre> 
    something something 
     <pre><code> alot of html and other code here </code></pre> 
"; 


注:文字列が同じ順序で毎回ではないだろう、多かれ少なかれ<pre><code>タグがあることができ

今私は<pre><code></code><pre>タグ内のコードを表示したいですプレーンテキストとして、あなたは"<""&lt;"">"にそれぞれ"&gt;"と変換する必要があることを知っていますが、問題はプレタグの外に他のタグがあることです。 htmlspecialchars($string);を使用すると、すべてのタグがプレーンテキストとしてh2タグとpreタグでさえ表示されます。

私はちょうどhtmlspecialchars()機能をpreタグの間のデータに使用する方法が欲しいです。

+0

のようにテンプレートのHTMLを形成することができる、私はこれの根本的な原因は、より多くのソフトウェアアーキテクチャの問題のように聞こえると思います。最初の場所にこれらの文字列を置くべきではありません。文字列の異なる部分を別々に持つようにリファクタリングするべきでしょう。 regexを使ってhtmlを解析するのは絶望的なことです。あなたがそのように行くと後で問題に遭う可能性があります。これらの文字列から実際に作業する必要がある場合は、少なくともパーサで適切に処理してください。 –

答えて

0

私は次のことがおそらく動作すると信じ:

$str = preg_replace("/<pre><code>[^<]*<\/code><\/pre>/", "<pre><code>other code</code></pre>", $str); 

echo $str; 

例: https://eval.in/669811

更新:

次は少し薄っぺらですが、動作する可能性があります。

$parts = preg_split("/<pre><code>|<\/code><\/pre>/", $str); 

$str = ""; 
for ($i=0;$i < count($parts);$i++) { 
    if ($i%2 == 0) { 
     $str .= ($i != 0?"</code></pre>":"").strip_tags($parts[$i]); 
    } else { 
      $str .= "<pre><code>".htmlentities($parts[$i]); 
    } 
} 

print_r($str); 

は、基本的にそれはあなたがその後も<pre><code>または</code></pre>によって分割するときのエントリは、コード部分の外側にあると奇数エントリが内部であることを前提としています。もちろん、これは、HTMLが適切にバランスがとれていないときに壊れますが、やはりほとんどのことが行います。

タグの外にあるものは、タグが剥奪され、codeタブ内のものはhtmlentitiesとなり、タグを保持します。

例:https://eval.in/671005

+0

お返事ありがとうございました。しかし、それでも問題は解決していないので、**私の質問を詳細**で更新しました。 –

+0

@AliHassanが更新されました。私は100%満足しているわけではありません。おそらく[PHP DOM](http://php.net/manual/en/book.dom.php)を使う方が良いでしょう。 – apokryfos

0

1.whyあなたが最初の場所でデータベースにHTMLを挿入しています。
2.データベース内の他の列に一般に使用されるテキストを切り取ります。
3. htmlをデータベースに挿入しないでください。
4. PHPでHTMLコードを使用しないでください。
5. http://www.smarty.net/を使用してmain.php(コード)main.tpl(htmlコード)のようなファイルを分割します。
6.Thenあなたは

<p>{$textfrom_mysql}</p> 
<pre><code>{$codefrom_mysql}</code></pre>