正则表达式php,用div替换ul li

时间:2015-04-13 10:30:49

标签: php regex html-lists

我有这个清单:

<ul>
    <li class="myclass">blablabla 1</li>
    <li class="myclass">blablabla 2</li>
    <li class="myclass">blablabla 3</li>
</ul>

我想要一个正则表达式:

<div class="newClass">blablabla 1</div>
<div class="newClass">blablabla 2</div>
<div class="newClass">blablabla 3</div>

仅使用此正则表达式替换<li>有效:

$pattern = '#<li class="newClass">(.+)</li>#';
$replacement = '<div class="newClass">$1</div>';
$texte = preg_replace($pattern, $replacement, $texte);

我也试图替换<ul>,但它不起作用:

$pattern = '#<ul>(<li class="myclass">(.+)</li>)*</ul>#';
$replacement = '<div class="newClass">$2</div>';
$texte = preg_replace($pattern, $replacement, $texte);

有什么问题?

2 个答案:

答案 0 :(得分:2)

你的模式几乎是正确的。

$pattern = '#<ul>(<li class="myclass">(.+)</li>)*</ul>#';

虽然你的模式存在多个缺陷。

  • <ul>会假设您的所有<li ...都以<ul>开头,<li class="myclass">blablabla 2</li>不是这种情况。因此,您必须将其与?一起使用,最好是在非捕获组中使用..即(?:<ul>)?,最后类似于(?:<\/ul>)?(请注意转义字符

  • 您未在<li..之前/之后检查空格和换行符,应将其更改为(\s*<li class="myclass">(.+)<\/li>\s*)

  • 此外,无需在*之后添加(<li ...>...<\/li>)

您的模式的工作修改将是(?:<(?:ul|ol)>)?(\s*<li class="myclass">(.+)<\/li>\s*)(?:<\/(?:ul|ol)>)?

有关更多解释和探索,请参阅demo

答案 1 :(得分:0)

您可以使用以下正则表达式执行<li>代码之外的所有<ol>...</ol>替换:

(?(DEFINE)(?<skip><ol>.*?<\/ol>))(?&skip)(*SKIP)(*FAIL)|\s*<li\s+class="myclass">(.*?)<\/li>\s*

(?(DEFINE)                  # We set up conditions
   (?<skip><ol>.*?<\/ol>))  # What we skip
   (?&skip)(*SKIP)(*FAIL)   # Fail what we skip
|                           # Else, match this
\s*<li\s+class="myclass">(.*?)<\/li>\s*

替换字符串将是:

<div class="newClass">$3</div>\n

然后,您只需删除<ul></ul>代码。

请参阅main regex demo heresample program here

<?php
   $str = "<ul>\n    <li class=\"myclass\">blablabla 1</li>\n    <li class=\"myclass\">blablabla 2</li>\n    <li class=\"myclass\">blablabla 3</li>\n</ul>\n<ol>\n    <li class=\"myclass\">blablabla 1</li>\n    <li class=\"myclass\">blablabla 2</li>\n    <li class=\"myclass\">blablabla 3</li>\n</ol>\n<ul>\n    <li class=\"myclass\">blablabla 1</li>\n    <li class=\"myclass\">blablabla 2</li>\n    <li class=\"myclass\">blablabla 3</li>\n</ul>"; 
   $re = "/(?(DEFINE)(?<skip><ol>.*?<\\/ol>))(?&skip)(*SKIP)(*FAIL)|\\s*<li\\s+class=\"myclass\">(.*?)<\\/li>\\s*/s"; 
   $subst = "<div class=\"newClass\">$3</div>\n";
   $result = preg_replace($re, $subst, $str);
   echo preg_replace("/<\/?ul>/", "", $result);
?>

输出:

<div class="newClass">blablabla 1</div>                                                                                                                                                                                                                
<div class="newClass">blablabla 2</div>                                                                                                                                                                                                                
<div class="newClass">blablabla 3</div>                                                                                                                                                                                                                

<ol>                                                                                                                                                                                                                                                   
    <li class="myclass">blablabla 1</li>                                                                                                                                                                                                               
    <li class="myclass">blablabla 2</li>                                                                                                                                                                                                               
    <li class="myclass">blablabla 3</li>                                                                                                                                                                                                               
</ol>                                                                                                                                                                                                                                                  
<div class="newClass">blablabla 1</div>                                                                                                                                                                                                                
<div class="newClass">blablabla 2</div>                                                                                                                                                                                                                
<div class="newClass">blablabla 3</div>
相关问题