-3

HTMLを修正しようとしていますが、完全に機能しています。しかし、1つは私に問題を与えてくれます。具体的には、オープンタグとクローズ<p></p>タグです。2つのケースを修正する必要があります。a)<p> </p>シーケンスを削除します。b)段落の終了と開始の空白を削除します。私はこれをやっています:

preg_replace("#<p>\s*</p>#","",$str);
preg_replace("#\s?(</?p>)\s?#", '$1', $str);

しかし、どちらも何も置き換えていません。何が間違っているのでしょうか。

編集:元のコード

$source=preg_replace("#\s?(</?p>)\s?#", '$1', $source); //Replace possible innecessary blank spaces
return preg_replace("#<p>\s*</p>#","",$source); //Delete all posible empty pharagraphs

ありがとう:D

4

3 に答える 3

1
$source = preg_replace('#<p>\s*</p>|(?<=<p>)\s+|\s+(?=</p>)#', '', $source);

バックスラッシュを明確にするには、一重引用符を使用します。\sまたは\\sのことですか?幸いなことに、この場合は問題ではありません。

上記のPCREは、間に空白(または何も)がない<p> </ p>タグ、<p>の直後の空白と</p>の直前の空白を削除します。ただし、元のコードが機能しなかった理由はわかりません。<p>または</p>タグの前または後の両方で単一のスペースを削除する必要があります(つまり" </p> "、になり"</p>"ます。

それでも問題が解決しない場合は、さらにコードを投稿する必要があります。変数を正しく渡していますか?あなたの問題について最小限のケースを書いて、プログラム全体を投稿してみてください。

于 2012-06-27T05:50:56.123 に答える
0

あなたはそれをに戻す必要があります$str

$str = preg_replace ($pattern, $replacement, $str);

特別な種類の空白を扱っていないことを確認してください。その場合は、複雑なパターンを使用します。

$pattern = '/<p>(&nbsp;|[\s\p{Z}\p{C}\x85\xA0\x{0085}\x{00A0}\x{FFFD}]+)*<\/p>/iu';

段落の開始と終了の空白を削除するには、パターンを使用します。

$pattern = '/(?<=<p>)(&nbsp;|[\s\p{Z}\p{C}\x85\xA0\x{0085}\x{00A0}\x{FFFD}]+)*/iu';
$pattern = '/(&nbsp;|[\s\p{Z}\p{C}\x85\xA0\x{0085}\x{00A0}\x{FFFD}]+)*(?=<\/p>)/iu';
于 2012-06-24T15:56:40.300 に答える
0

2番目の正規表現は、もう存在しないため機能しませ</p>ん。最初にこれを実行する必要があります。空白を削除するために正規表現が必要な理由により、トリムを使用できます

$str = trim(preg_replace("#<p>(.*)</p>#Us", "$1", $str));

ただし、stackoverflowで何度も言及されているように、htmlを解析するために正規表現を使用するべきではありません。

編集:

preg_replace("/\s*<\/?p>\s*/", "", $str);
于 2012-06-24T15:58:52.960 に答える