PHP正则表达式从html字符串

时间:2015-10-16 10:33:17

标签: php regex

我一直在寻找答案,但我找不到。

我想从包含html的字符串中删除类b-ce

$tmp = '<div class="a b-c d e">b-c</div>';
$tmp2 = '<div class="a b-c d">b-c</div>';
$tmp3 = '<div class="a e b-c d">b-c</div>';
$tmp4 = '<div class="a d e">b-c</div>';

我试过像这样的事情

preg_replace('#class="(.*?)(b-c|e)(.*?)"#si', 'class="\\1\\3"', $a)

但它并不适用于所有情况(不适用于$tmp$tmp2)。

正则表达式$tmp后,$tmp2$tmp3$tmp4应该

<div class="a d">b-c</div>

我希望这个正则表达式将删除所有类中的所有类,无论有多少类,无论顺序如何 anyony可以帮帮我吗?我在正则表达式中表现不佳:/

2 个答案:

答案 0 :(得分:2)

如果你想使用正则表达式(但总是更好地使用DOM解析器),你可以通过这种方式实现目标:

<?php

$tmp = '<div class="a b-c d e">b-c</div>';
$tmp2 = '<div class="a b-c d">b-c</div>';
$tmp3 = '<div class="a e b-c d">b-c</div>';
$tmp4 = '<div class="a d e">b-c</div>';

function remove($tmp) {
    return preg_replace_callback('/class="([^"]+)"/', function($m) {
    if(strpos($m[1], "b-c") !== false) {
        $m[0] = preg_replace("/\s*b-c\s*/",' ',$m[0],1);
    }
    if(strpos($m[1],"e") !== false) {
        $m[0] = preg_replace("/\s*e\s*/",' ',$m[0], 1);
    }
    return $m[0];
    }, $tmp);
}

echo remove($tmp), "\n", remove($tmp2), "\n", remove($tmp3), "\n" , remove($tmp4);

输出:

<div class="a d ">b-c</div>
<div class="a d">b-c</div>
<div class="a d">b-c</div>
<div class="a d ">b-c</div>

不完美(有一个尾随空格)但效果很好(类属性允许使用空格)。

我希望它有所帮助

答案 1 :(得分:0)

您可以使用str_replace

尝试以下代码
str_replace(" b-c ", " ", $tmp); // This will replace b-c if it is not the first or last class
str_replace("b-c ", " ", $tmp); // This will replace b-c if it is the first class
str_replace(" b-c", " ", $tmp); // This will replace b-c if it is the last class
str_replace('"b-c"', '""', $tmp); // This will replace b-c if it is the only class and the quotes for the class HTML property are double quotes

此代码不会删除b-c中的<div>b-c</div>,因为它会在

之前或之后搜索带有空格的b-c