【问题标题】:PHP preg_match_all + str_replacePHP preg_match_all + str_replace
【发布时间】:2012-01-03 22:07:07
【问题描述】:

我需要找到一种方法来替换


之前的所有
中的所有

这是一个示例 html:

<p>2012/01/03</p>
<blockquote>
    <h4>File name</h4>
    <p>Good Game</p>
</blockquote>
<blockquote><p>Laurie Ipsumam</p></blockquote>
<h4>Some title</h4>
<hr />
<p>Lorem Ipsum</p>
<blockquote><p>Laurel Ipsucandescent</p></blockquote>

这是我得到的:

    $pieces = explode("<hr", $theHTML, 2);
    $blocks = preg_match_all('/<blockquote>(.*?)<\/blockquote>/s', $pieces[0], $blockmatch); 

    if ($blocks) { 
        $t1=$blockmatch[1];
        for ($j=0;$j<$blocks;$j++) {
            $paragraphs = preg_match_all('/<p>/', $t1[$j], $paragraphmatch);
            if ($paragraphs) {
                $t2=$paragraphmatch[0]; 
                for ($k=0;$k<$paragraphs;$k++) { 
                    $t1[$j]=str_replace($t2[$k],'<p class=\"whatever\">',$t1[$j]);
                }
            }
        } 
    } 

我想我真的很接近,但我不知道如何将我刚刚拼凑和修改的html重新组合在一起。

【问题讨论】:

    标签: php preg-replace preg-match-all str-replace


    【解决方案1】:

    您可以尝试使用simple_xml 或更好的DOMDocument (http://www.php.net/manual/en/class.domdocument.php),然后再将其设为有效的 html 代码,并使用此功能查找您要查找的节点并替换它们,为此您可以试试XPath (http://w3schools.com/xpath/xpath_syntax.asp)。

    编辑 1:

    看看这个问题的答案:

    RegEx match open tags except XHTML self-contained tags

    【讨论】:

    • 好吧,我要做的是更正 MySQL 数据库/Drupal 中的数千个条目,这些条目都以相同的模式开始。我的逻辑是使用 php 来获取所有条目并替换所有标签,方法是首先删除所有

      和内联样式,然后向块引用中的所有

      添加一个类,最后删除块引用。我通过添加一个 while(preg_match) 使它与下面的代码一起工作,但仍然存在如果有一个

      而没有

      的情况。只发生在几百个案例中,但仍然会发生。我会看看你的解决方案,希望能找到一些东西。

    【解决方案2】:
    $string = explode('<hr', $string);
    $string[0] = preg_replace('/<blockquote>(.*)<p>(.*)<\/p>(.*)<\/blockquote>/sU', '<blockquote>\1<p class="whatever">\2</p>\3</blockquote>', $string[0]);
    $string = $string[0] . '<hr' . $string[1];
    

    输出:

    <p>2012/01/03</p>
    <blockquote>
        <h4>File name</h4>
        <p class="whatever">Good Game</p>
    </blockquote>
    <blockquote><p class="whatever">Laurie Ipsumam</p></blockquote>
    <h4>Some title</h4>
    <hr />
    <p>Lorem Ipsum</p>
    <blockquote><p>Laurel Ipsucandescent</p></blockquote>
    

    【讨论】:

    • 炸了,刚注意到没有得到第一个

      标签。

    • 你确实有一个丑陋的正则表达式,也许教人们正则表达式可用于解析 html 并不是一个好主意,即使在这种特殊情况下它可能工作
    • 是的。如果
      中有多个

      标记,它将不起作用。复杂性增长得太快了。

    • 我已经让它工作了一段时间(preg_match)只是重复你给的代码,但现在我需要找到一种方法来添加一个

      我不确定您所说的“将

      ?

    猜你喜欢
    • 2022-01-23
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多