specifics用php函数替换string中的substring

specifics用php函数替换string中的substring

问题描述:

in the text, i would like to replace the div tag li. But not everyone just certain well defined. In this case, those that have id that begins "tab-*" I need something using PHP functions easily from text:

<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>

get this text

<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>

Can you advise me?

Thank you

在文中,我想替换 div strong>标签 li 即可。 但不是每个人都确定定义明确。 在这种情况下,那些id开头“tab - *” 我需要使用PHP函数轻松地从文本中获取: p>

 &lt; div id =“tab-141285” 类=“我的级”&GT;  
&lt; div class =“my-subclass”&gt;  
&lt; div&gt;  
 Lorem ipsum dolor sit amet consectetuer 
&lt; / div&gt;  
&lt; / div&gt;  
&LT; / DIV&GT;  
&lt; div id =“tab-85429”class =“my-class”&gt;  
&lt; div class =“my-subclass”&gt;  
&lt; div&gt;  
 Lorem ipsum dolor sit amet consectetuer 
&lt; / div&gt;  
&lt; / div&gt;  
&lt; / div&gt; 
  code>  pre> 
 
 

获取此文本 p>

 &lt; li id =“tab-141285” 类=“我的级”&GT;  
&lt; div class =“my-subclass”&gt;  
&lt; div&gt;  
 Lorem ipsum dolor sit amet consectetuer 
&lt; / div&gt;  
&lt; / div&gt;  
&LT; /锂&GT;  
&lt; li id =“tab-85429”class =“my-class”&gt;  
&lt; div class =“my-subclass”&gt;  
&lt; div&gt;  
 Lorem ipsum dolor sit amet consectetuer 
&lt; / div&gt;  
&lt; / div&gt;  
&lt; / li&gt; 
  code>  pre> 
 
 

你能告诉我吗? p>

谢谢 p> div>

Regular expressions are not adequate for parsing HTML. Any regex you try to use will be fragile. I suggest using the DOM extension for this instead.

The idea is to:

  1. Find all the <div> elements that have an id attribute that begins with "tab-" using the XPath query //div[starts-with(@id, "tab-")]
  2. Create a new <li> element for each of them.
  3. Move all the <div>'s attributes and child nodes to the new <li> element.
  4. Replace the old <div> with the new <li>.

Because your string doesn't have a root element, we'll do a little dance before and after to put it in one then rebuild it.


Example:

$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;

Output:

<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>

use domdocument xml component of php just load the string in domdocument object and search for element then get its attribute and check its id and compare using preg_replace and remove if it met your condition