我有这个列表:
<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);
怎么了?
最佳答案
你的模式几乎是正确的。
$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以获得更多解释和探索。
关于php - 正则表达式 php,用 div 替换 ul li,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29603148/