PHP正则表达式帮助 - 反向搜索?

时间:2010-04-09 21:09:42

标签: php html regex

所以,我有一个正则表达式搜索HTML标签并稍微修改它们。它工作得很好,但我需要对我找到的最后一个结束HTML标记做一些特别的事情。不确定最好的方法。我正在考虑某种反向注册,但还没有办法做到这一点。到目前为止,这是我的代码:

$html = '<div id="test"><p style="hello_world">This is a test.</p></div>';

$pattern = array('/<([A-Z][A-Z0-9]*)(\b[^>]*)>/i');
$replace = array('<tag>');
$html = preg_replace($pattern,$replace,$html);

// Outputs: <tag><tag>This is a test</p></div>

我想用<tag>替换<end_tag>的最后一次出现,例如{{1}}。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如果我读得正确,你想在文件中找到最后一个结束标签。

您可以找到最后一次出现的</*>,其中不再有'&lt;&gt;'之后的人物。这将是最后一个标记,假设所有剩余的尖括号都编码为&lt;&gt;

<?php
$html = '<div id="test"><p style="hello_world">This is a test.</p></div>';

// Outputs:
// '<div id="test"><p style="hello_world">This is a test.</p></tag>'
echo preg_replace('/<\/[A-Z][A-Z0-9]*>([^<>]*)$/i', '</tag>$1', $html);

这会将</div>替换为</tag>,并保留最终结束标记后的所有内容。

我不知道为什么你只想用结束标记来做这个,就像你改变它一样,你也必须改变匹配的开始标记。此外,这将无法找到最后一个自动结束标记,例如<img /><br />

答案 1 :(得分:0)

我相信这种方法与@meager的效果相同,但更简洁:

<?php
$html = '<div id="test"><p style="hello_world">This is a test.</p></div>';
$readmore = ' <a href="/foo/bar">Read More&hellip;</a>';

// Outputs:
// '<div id="test"><p style="hello_world">This is a test.</p> <a href="/foo/bar">Read More&hellip;</a></div>'
echo preg_replace('#</\w>\s*$#', $readmore .'$1', $html);
?>