【问题标题】:specifics replace substring in string with php function用php函数替换字符串中的子字符串
【发布时间】:2014-10-10 06:14:07
【问题描述】:

在正文中,我想替换div标签li。但并不是每个人都只是确定明确。在这种情况下,那些 id 以“tab-*”开头的 我需要从文本中轻松使用 PHP 函数的东西:

<div id="tab-141285" class="my-class">                         
  <div class="my-subclass">              
    <div>                     
     Lorem ipsum dolor sit amet consectetuer                 
    </div>             
  </div>                 
</div>                   
<div id="tab-85429"  class="my-class">                                  
  <div class="my-subclass">              
    <div>                      
    Lorem ipsum dolor sit amet consectetuer                  
    </div>             
  </div>                 
</div>

获取此文本

<li id="tab-141285" class="my-class">                          
  <div class="my-subclass">              
    <div>                     
     Lorem ipsum dolor sit amet consectetuer                 
    </div>             
  </div>                 
</li>                
<li id="tab-85429"  class="my-class">                                   
  <div class="my-subclass">              
    <div>                      
    Lorem ipsum dolor sit amet consectetuer                  
    </div>             
  </div>                 
</li>

你能给我建议吗?

谢谢

【问题讨论】:

  • 你试过的代码在哪里?我看不到任何 preg_replace 相关。
  • 我建议不要使用私有子字符串替换方法。尽管这是可能的,但当标记没有完全按预期实施时,事情就会中断。相反,您应该看一下基于 php 的 DOM 解析器和操纵器。

标签: php preg-replace replaceall


【解决方案1】:

正则表达式不足以解析 HTML。您尝试使用的任何正则表达式都将是脆弱的。我建议改用DOM extension

这个想法是:

  1. 使用XPath query //div[starts-with(@id, "tab-")] 查找具有以"tab-" 开头的id 属性的所有&lt;div&gt; 元素
  2. Create 一个新的 &lt;li&gt; 元素。
  3. &lt;div&gt; 的所有属性和子节点移动到新的&lt;li&gt; 元素。
  4. 用新的&lt;li&gt;替换旧的&lt;div&gt;

因为你的字符串没有根元素,所以我们会在之前和之后跳一段小舞,把它放在一个里面然后重建它。


示例:

$html = <<<'HTML'
<div id="tab-141285" class="my-class">
  <div class="my-subclass">
    <div>
     Lorem ipsum dolor sit amet consectetuer
    </div>
  </div>
</div>
<div id="tab-85429"  class="my-class">
  <div class="my-subclass">
    <div>
    Lorem ipsum dolor sit amet consectetuer
    </div>
  </div>
</div>
HTML;

$dom = new DOMDocument();
$dom->loadHTML("<div>$html</div>", LIBXML_HTML_NOIMPLIED);
$xpath = new DOMXPath($dom);

$nodes = $xpath->query('//div[starts-with(@id, "tab-")]');

foreach ($nodes as $node) {
    $li = $dom->createElement('li');

    while ($node->attributes->length) {
        $li->setAttributeNode($node->attributes->item(0));
    }
    while ($node->firstChild) {
        $li->appendChild($node->firstChild);
    }

    $node->parentNode->replaceChild($li, $node);
}

$html = '';
foreach ($dom->documentElement->childNodes as $node) {
    $html .= $dom->saveHTML($node);
}

echo $html;

输出:

<li id="tab-141285" class="my-class">
  <div class="my-subclass">
    <div>
     Lorem ipsum dolor sit amet consectetuer
    </div>
  </div>
</li>
<li id="tab-85429" class="my-class">
  <div class="my-subclass">
    <div>
    Lorem ipsum dolor sit amet consectetuer
    </div>
  </div>
</li>

【讨论】:

  • 谢谢,这就是我想要的。我只是在最后而不是添加 echo $html; echo preg_replace ('/()|()/i', '', $ html);
  • 嗨,毕竟我还有一个问题。为什么是 $dom->loadHTML("
    $html
    ", LIBXML_HTML_NOIMPLIED);
    而不是 $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED);
【解决方案2】:

使用 php 的 domdocument xml 组件只需在 domdocument 对象中加载字符串并搜索元素,然后获取其属性并检查其 id 并使用 preg_replace 进行比较,如果满足您的条件则删除

【讨论】:

  • 它应该是什么样子?
猜你喜欢
  • 2017-03-23
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 2013-07-23
相关资源
最近更新 更多