我需要包装这个字符串:
<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文档的字符串代码,首先我计算我需要生成所需正则表达式的行数,我不确定是否$&amp;可以用来说:这就是我需要包装的东西..
$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);
我是否接近解决方案?
答案 0 :(得分: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 - 修饰符,使整个doc被视为单个字符串并忽略大小写。可能很方便。
(?:(?!(&lt; / p&gt;))。*?) - 这是主要部分 - 负面条件匹配,以确保匹配字符串中没有