【问题标题】:PHP - delete string from start to endpointPHP - 从开始到端点删除字符串
【发布时间】:2014-06-27 07:14:27
【问题描述】:

我在 PHP 中有一个这样的字符串:

<nav role="navigation" class="main-navigation" id="site-navigation">
  <li class="page_item page-item-2"><a href="/sample-page/">Sample Page</a></li>
  <li class="page_item page-item-69 current_page_item"><a href="/transport-quote-step-2/">Transport Quote Step 2</a></li>
  <li class="page_item page-item-70"><a href="/transport-quote-step-3/">Transport Quote Step 3</a></li>
  <li class="page_item page-item-71"><a href="/transport-quote-step-4/">Transport Quote Step 4</a></li>
</nav>

现在我想找到包含类“page-item-69”的 LI 元素,我需要删除整个 LI 元素,这样我才能得到这样的输出:

<nav role="navigation" class="main-navigation" id="site-navigation">
  <li class="page_item page-item-2"><a href="/sample-page/">Sample Page</a></li>
  <li class="page_item page-item-70"><a href="/transport-quote-step-3/">Transport Quote Step 3</a></li>
  <li class="page_item page-item-71"><a href="/transport-quote-step-4/">Transport Quote Step 4</a></li>
</nav>

【问题讨论】:

  • 你知道 PHP domdocument 类吗?它可以扫描您的 HTML DOM,然后您就可以使用它。我会说最干净的解决方案。
  • 试试Jquery,它会轻松处理DOM
  • @ddw147 BobRoxx 标记了这个问题php 所以我想这个答案对他帮助不大:-/
  • @BobRoxx 这是评论而不是答案,我说试试看,可能对他有帮助。
  • 我真的需要 PHP 解决方案 - 我知道如何使用 Jquery 来解决,但我需要在 PHP 中使用它,因为我将它作为字符串变量。

标签: php string replace preg-replace


【解决方案1】:

如果您需要在服务器端执行此操作,那么这里有一个很好的 PHP 示例,说明如何删除特定标记下的所有内容 PHP: Strip a specific tag from HTML string?

这是我如何使用 JQUERY 处理此问题的代码示例。

<!DOCTYPE html>
    <head>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
        <script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script>

        <scripts>
        $(document).ready(function(){
          /* DELETE */
          $(".page-item-69").remove();
          /* Otherwise hide */
          $(".page-item-69").hide();
        });
        </scripts>


    </head>
    <body>
    <?php 
    /* YOUR PHP CODE */
    echo YOUR_STRING . "/n";
    ?>

    </body>
</html>

【讨论】:

    【解决方案2】:

    在当今的 PHP 世界中,这里首选的方法是使用 PHP 的 DOM 模型。可悲的是,我自己仍在学习这一点,并没有很好地掌握这一点。不过,对于它的价值,这是我的尝试。 (可能有更简单/更好的方法来做到这一点。)

    $string = '<nav role="navigation" class="main-navigation" id="site-navigation">
      <li class="page_item page-item-2"><a href="/sample-page/">Sample Page</a></li>
      <li class="page_item page-item-69 current_page_item"><a href="/transport-quote-step-2/">Transport Quote Step 2</a></li>
      <li class="page_item page-item-70"><a href="/transport-quote-step-3/">Transport Quote Step 3</a></li>
      <li class="page_item page-item-71"><a href="/transport-quote-step-4/">Transport Quote Step 4</a></li>
    </nav>';
    
    $dom_document = new DOMDocument(); // CREATE A NEW DOCUMENT
    $dom_document->loadHTML($string); // LOAD THE STRING INTO THE DOCUMENT
    $lis = $dom_document->getElementsByTagName('li'); // PULL OUT THE LIS OUT OF THE DOCUMENT
    
    // LOOP THROUGH EACH LI
    foreach ($lis AS $li) {
    
        // IF WE FIND page-item-69, DELETE THE ITEM
        if (preg_match('/page-item-69/', $li->getAttribute('class'), $m)) {
            $li->parentNode->removeChild($li);
        }
    
    }
    
    $new_string_2 = $dom_document->saveHTML(); // WRITE THE CHANGES TO A STRING
    
    print $new_string_2;
    

    这似乎对我有用,但由于我是老派,以下是使用 REGEX 的方法:

    $string = '<nav role="navigation" class="main-navigation" id="site-navigation">
      <li class="page_item page-item-2"><a href="/sample-page/">Sample Page</a></li>
      <li class="page_item page-item-69 current_page_item"><a href="/transport-quote-step-2/">Transport Quote Step 2</a></li>
      <li class="page_item page-item-70"><a href="/transport-quote-step-3/">Transport Quote Step 3</a></li>
      <li class="page_item page-item-71"><a href="/transport-quote-step-4/">Transport Quote Step 4</a></li>
    </nav>';
    
    $string = preg_replace('~(\s*)<li class="page_item page-item-69.*?</li>~i', '', $string);
    
    print $string;
    

    这将输出以下内容:

    <nav role="navigation" class="main-navigation" id="site-navigation">
      <li class="page_item page-item-2"><a href="/sample-page/">Sample Page</a></li>
      <li class="page_item page-item-70"><a href="/transport-quote-step-3/">Transport Quote Step 3</a></li>
      <li class="page_item page-item-71"><a href="/transport-quote-step-4/">Transport Quote Step 4</a></li>
    </nav>
    

    【讨论】:

      【解决方案3】:

      这将对您有所帮助:

      $str = '<nav role="navigation" class="main-navigation" id="site-navigation">
        <li class="page_item page-item-2"><a href="/sample-page/">Sample Page</a></li>
        <li class="page_item page-item-69 current_page_item"><a href="/transport-quote-step-2/">Transport Quote Step 2</a></li>
        <li class="page_item page-item-70"><a href="/transport-quote-step-3/">Transport Quote Step 3</a></li>
        <li class="page_item page-item-71"><a href="/transport-quote-step-4/">Transport Quote Step 4</a></li>
      </nav>';
      
      $doc = new DOMDocument();
      @$doc->loadHTML($str);
      
      foreach ($doc->getElementsByTagName('li') as $tag) {
          if (strpos($tag->getAttribute('class'), 'page-item-69') !== false) {
              $tag->parentNode->removeChild($tag);
          }
      }
      
      $doc->removeChild($doc->firstChild);
      $doc->replaceChild($doc->firstChild->firstChild->firstChild, $doc->firstChild);
      $str = $doc->saveHTML();
      
      echo $str;
      

      【讨论】:

        猜你喜欢
        • 2017-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-24
        • 1970-01-01
        相关资源
        最近更新 更多