1

関数を使用せずにいくつかの html 要素を削除できるように、いわゆるテキスト クリーナーを作成しようとしていstrip_tags()ます。

私の正規表現は次のようになります。<em>|</em>|<p[^>]*>|</p[^>]*>|<span[^>]*>|</span[^>]*>|<div[^>]*>|</div[^>]*>|&nbsp;|<table[^>]*>(.*?)</table[^>]*>

私のコードは次のようになります。

$string = "some very messy string here ";
$pattern = '<em>|</em>|<p[^>]*>|</p[^>]*>|<span[^>]*>|</span[^>]*>|<div[^>]*>|</div[^>]*>|&nbsp;|<table[^>]*>(.*?)</table[^>]*>';
$replace = ' ';

$clean =  preg_replace($pattern, $replace, $string);

echo $clean;

私の理解を超えた理由で、エコーは何も返しません。

お時間をいただきありがとうございます

更新 #1

すべてのコンテンツを含むテーブルを削除するかどうかを尋ねられた場合、答えは「はい」です。

4

2 に答える 2

4

正規表現には区切り記号が必要です。例えば:

$pattern = '~<em>|</em>|<p[^>]*>|</p[^>]*>|<span[^>]*>|</span[^>]*>|<div[^>]*>|</div[^>]*>|&nbsp;|<table[^>]*>(.*?)</table[^>]*>~';

区切り文字についてはこちらをご覧ください。

また、一部の HTML 仕様 (私の知る限り、XHTML を除くすべて) では、大文字のタグも使用できることに注意してください。そのため、大文字と小文字を区別しないための修飾子を正規表現に追加することを検討してください。さらに、開始タグと終了タグの間に改行があると、テーブルの削除が機能しない場合があります (.既定では改行が一致しないため)。sこれを解決するには、DOTALL 修飾子を追加します。

$pattern = '~<em>|</em>|<p[^>]*>|</p[^>]*>|<span[^>]*>|</span[^>]*>|<div[^>]*>|</div[^>]*>|&nbsp;|<table[^>]*>(.*?)</table[^>]*>~is';

最後の注意: 他の人が指摘したように、HTML の問題に対する正規表現の解決策は、一粒の塩で取られるべきです。ネストされたテーブルは、コメントと同様に問題を引き起こします。扱っているデータがよくわかっている場合、問題は一般的な HTML よりもはるかに単純である可能性があります。ただし、コードが少なくとも有効であることを確認し、ネストされた構造やコメント内の HTML 文字などのすべての奇妙な点について知っている必要があります。

于 2012-10-13T14:52:45.733 に答える
3

まず、この回答を見てください。これにより、最初から問題が解決するはずです。回答を読んだ後も続行したい場合は、次のことをお知らせします。

I want to <em<p>>emphasize</<p>em> that it's not possible!

それをきれいにしてみてください!

于 2012-10-13T14:59:08.170 に答える