php
  • regex
  • 2015-10-16 2 views -2 likes 
    -2

    Я искал ответ, но я не нашел.PHP regex для удаления классов из строки html

    Я хочу удалить классы b-c и e из строки, содержащей html.

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

    Я попытался somethinkg как этот

    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 мне помочь? Я не очень хорошо в регулярное выражение:/

    +0

    Вы имели в виду, что это работает для некоторых классов и не работает для некоторых? – MohitC

    +0

    Я имел в виду, что может быть много других классов, и я хочу удалить только некоторые из них. – Sylwek

    +0

    Для каких классов работает текущее регулярное выражение? – MohitC

    ответ

    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 с пробелами до и после

    +0

    и что такое b-c - последний класс div? и что для класса e он хочет удалить слишком – MohitC

    +0

    , если b-c является последним классом, он будет использовать последнюю строку кода, который я использовал. Это проверяет, есть ли пробел перед 'b-c', который будет'

    b-c
    ' . Я добавлю комментарии к строкам, объясняющим, для чего каждый –

    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> 
    

    Не идеально (есть замыкающая пространство), но это работает хорошо (допускаются пробелы в атрибуте класса).

    Я надеюсь, что это поможет

     Смежные вопросы

    • Нет связанных вопросов^_^