0

この文字列を含める必要があります:

<p class="someclass">some text</p>

このようなテーブルタグで:

<table class="anotherclass"><tr><td>
<p class="someclass">some text</p>
</td></tr></table>

次のように1、2、または3行のコードを含めることができるため、少し複雑になります。

<table class="anotherclass"><tr><td>
<p class="someclass">some text</p>
<p class="someclass">more text</p>
<p class="someclass">another line of text</p>
</td></tr></table>

次のコードでPHPを使用して最善を尽くしましたが、機能しません:/ $docにはhtmlドキュメントの文字列コードが含まれています。最初に必要な正規表現を生成するために必要な行数を数えます。以前は言っていました:これは私が包む必要があるものです。

$line_count=substr_count($doc, '<p class="someclass">');

for($i=0;$i<$line_count;$i++)
{$add.='[^</p>]</p>';}

$regex='/<p class="someclass">'.$add.'/';
$replace='<table class="anotherclass"><tr><td>$&</td></tr></table>';
$doc=preg_replace($regex, $replace, $doc);

私も解決策に近づいていますか?

4

1 に答える 1

1

このコードを試してください-1つ以上をピックアップします

「someclass」のブロック

$doc = '
<p class="someclass">Jerky tri-tip pancetta t-bone beef, meatball meatloaf flank brisket beef ribs biltong short ribs capicola fatback.</p>
<p class="someclass">Meatball short ribs venison leberkas shoulder meatloaf corned beef ham salami. Shank sirloin fatback flank pig spare ribs.</p>
<p class="someclass">Cow hamburger leberkas drumstick jerky beef short loin tenderloin swine pork. Kielbasa short loin jerky salami.</p>
';

$regex='/((<p class="someclass">(?:(?!(<\/p>)).*?)<\/p>\s*)+)/is';
$replace='<table class="anotherclass"><tr><td>$1</td></tr></table>';
$doc=preg_replace($regex, $replace, $doc);

いくつかのコメント:

((\ s *)+)-()+は1つ以上に一致し、\s*は間隔が無視されるようにします

そして次

、external()は、すべてを一致させるために必要です

$1変数にブロックします

/ is-ドキュメント全体を単一の文字列として扱い、大文字と小文字を区別しないようにする修飾子。便利かもしれません。

(?:(?!(</ p>))。*?)-それが主要部分です-負の条件付き一致で、

一致した文字列の内側

于 2013-02-19T23:02:26.087 に答える