包含单行或多行搜索结果PHP / regex

时间:2013-02-19 22:35:50

标签: php regex

我需要包装这个字符串:

<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);

我是否接近解决方案?

1 个答案:

答案 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;))。*?) - 这是主要部分 - 负面条件匹配,以确保匹配字符串中没有