0

我需要封装这个字符串:

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

在这样的表格标签中:

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

它变得稍微复杂一些,因为可能会有一、两或三行代码像这样被封装:

<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

试试这个代码 - 它会选择一个或多个

“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 回答