【问题标题】:PHP regex help -- reverse search?PHP 正则表达式帮助——反向搜索?
【发布时间】:2010-04-09 21:09:41
【问题描述】:

所以,我有一个搜索 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>

我想用特殊的东西替换最后出现的 &lt;tag&gt;,例如 &lt;end_tag&gt;

有什么想法吗?

【问题讨论】:

  • 如果我再次看到那个链接,我会生气的;/
  • 请注意,HTML 属性值可以包含纯 &gt; 字符。
  • 我们正在寻找最后一个 关闭 HTML 标记,所以我认为属性不会成为问题。
  • @stereofrog 哪个链接?这个? stackoverflow.com/questions/1732348/… >;-)

标签: php html regex


【解决方案1】:

如果我没看错,你想在文档中找到最后一个结束标记。

您可以找到最后一次出现的&lt;/*&gt;,它后面没有更多的“”字符。这将是最后一个标签,假设所有剩余的尖括号都编码为&amp;lt;&amp;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);

这会将最后的&lt;/div&gt; 替换为&lt;/tag&gt;,保留最后结束标记之后的所有内容。

我不知道你为什么只想用结束标签来做这个,好像你改变它你也必须改变匹配的开始标签。此外,这将无法找到最后一个自闭合标签,例如 &lt;img /&gt;&lt;br /&gt;

【讨论】:

    【解决方案2】:

    我相信这个方法和@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);
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-23
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多