PHP正则表达式删除最后一段和内容

时间:2015-06-19 02:03:05

标签: php regex html-parsing

我将以下内容存储在MySQL表中:

<p>First paragraph</p><p>Second paragraph</p><p>Third paragraph</p><div class="item"><p>Some paragraph here</p><p><strong><u>Specs</u>:</strong><br /><br /><strong>Weight:</strong> 10kg<br /><br /><strong>LxWxH:</strong> 5mx1mx40cm</p><p>This is the paragraph I am trying to remove with regex.</p></div>

我正在尝试删除表格中每一行的最后一个段落标记和内容。我可以很容易地用PHP循环遍历表格,但正则表达式让我感到难过。

我在stackoverflow上找到的每个preg_match都会给我一个“preg_match():Unknown modifier”错误,或者var_dump显示一个空数组。我相信这只会匹配内容,即使它确实有效,所以我认为我需要preg_replace?

行的长度不一样,但它总是要我完全删除的最后一段。

如果有人能告诉我如何,我将不胜感激。感谢

2 个答案:

答案 0 :(得分:2)

这将删除最后一个<p>anything</p>

<?php
$html = '<p>First paragraph</p><p>Second paragraph</p><p>Third paragraph</p><div class="item"><p>Some paragraph here</p><p><strong><u>Specs</u>:</strong><br /><br /><strong>Weight:</strong> 10kg<br /><br /><strong>LxWxH:</strong> 5mx1mx40cm</p><p>This is the paragraph I am trying to remove with regex.</p></div>';
$html = preg_replace('~(.*)<p>.*?</p>~', '$1', $html);
echo $html;

(.*)抓住所有内容,直到最后一个段落标记并存储它。 .*?抓取段落标记之间的所有内容,?告诉它停在下一个结束段落标记。我们不在这里使用捕获因为我们不关心里面是什么。 $1是在上一个<p>之前找到的内容。 ~是分隔符,指示正则表达式的开始和结束位置。我怀疑这是导致你的正则表达式失败的原因。 http://php.net/manual/en/regexp.reference.delimiters.php

输出:

<p>First paragraph</p><p>Second paragraph</p><p>Third paragraph</p><div class="item"><p>Some paragraph here</p><p><strong><u>Specs</u>:</strong><br /><br /><strong>Weight:</strong> 10kg<br /><br /><strong>LxWxH:</strong> 5mx1mx40cm</p></div>

注意:您应该考虑使用XML / HTML解析器,因为使用HTML / XML的正则表达式会很快变得非常混乱。

http://php.net/manual/en/refs.xml.php
How do you parse and process HTML/XML in PHP?

演示: http://sandbox.onlinephpfunctions.com/code/0ddf46c328323e8b6357313a5464733ff797bc3f

答案 1 :(得分:0)

没有正则表达式的解决方案是

$string = '<p>First paragraph</p><p>Second paragraph</p><p>Third paragraph</p><div 
class="item"><p>Some paragraph here</p><p><strong><u>Specs</u>:</strong><br /><br /> 
<strong>Weight:</strong> 10kg<br /><br /><strong>LxWxH:</strong> 5mx1mx40cm</p><p>This 
is the paragraph I am trying to remove with regex.</p></div>';

$lastOccurenceOfEnd = strrpos($string,"</p>");
$lastOccurenceOfStart = strrpos($string,"<p>");
$removedParagraph = substr_replace($string, '', $lastOccurenceOfStart, 
$lastOccurenceOfEnd-$lastOccurenceOfStart+4);

echo $removedParagraph;