4

文字列から開始段落タグと終了段落タグを削除するPHP関数を作成する必要がありますが、それらが最初/最後にある場合に限ります。したがって、文字列:

"Simple Test"
"<p>Here</p>"
"<p>Test <p>Nested</p> Outside </p>"

出力します:

"Simple Test"
"Here"
"Test <p>Nested</p> Outside"

HTMLPurifierはこれを行うことができますか、それともsubstrを使用する必要がありますか?私の最初の試みは:

if(strpos($str,'<p>') === 0  && strcmp(substr($str,-1,4),'</p>'))
$str = substr($str,3,strlen($str)-4);
4

4 に答える 4

17

これは正規表現ソリューションです:

$str = preg_replace('!^<p>(.*?)</p>$!i', '$1', $str);
于 2011-01-01T21:20:29.173 に答える
2

のような正規表現

</??p(?:\s+\w*)>

<p \>、</ p>、<p somestuff>と一致します-その正規表現を使用して、一致するものを空の文字列などに置き換えます。

HTH

PS:念のため、「大文字と小文字を区別しない」フラグを使用してください。

編集:グループを非キャプチャグループにしました。

于 2011-01-01T21:23:10.147 に答える
2

これは正規表現の方法です。

<p>唯一の要件が正確なラッピング文字列を取り除くことである場合は問題ありません</p>

HTMLに対して堅牢な汎用ソリューションが必要な場合は、DOMを使用する必要があります。(たとえば、ラッピング段落タグでクラス、ID、およびさまざまな属性を受け入れたい場合)。ただし、domdocumentをロードするとhtmlが正規化されることに注意してください。

<?
$str = array(
"Simple Test",
"<p>Here</p>",
"<p>Test <p>Nested</p> Outside </p>"
);

foreach($str as $st) {
  echo $st." ---> ";
  if(preg_match('#<p>(.+)</p>#',$st,$match) === 1) { // 1 if matched, 0 if not matched
    $st = $match[1]; // if matched, replace our string by the match
  }
  echo $st."\n";
}

これにより、次の出力が生成されます。

Simple Test ---> Simple Test
<p>Here</p> ---> Here
<p>Test <p>Nested</p> Outside </p> ---> Test <p>Nested</p> Outside 

簡単にワンライナーにすることができます。たとえば、preg_replaceとregexの後方参照を使用すると、一致する文字列を置き換えることができます...しかし、この形式でより理解しやすいものになることを願っています。

于 2011-01-01T21:26:37.980 に答える
-1

それほど派手なパターンではありませんが、機能します$inf = preg_replace('/<[\/]*?p.*?>/', '', $info);

于 2015-09-02T18:53:36.977 に答える