php
  • regex
  • dom
  • 2016-09-30 3 views 4 likes 
    4

    ich diese Zeichenfolge haben, die zu einem Text_Diff übergeben wurde ...Tags entfernen innerhalb Attribute

    <?php 
    $left_string = '<div class="class1" style="display:block;">Some Text<del> Orig</del></div>'; 
    $right_string = '<div class="class1" style="<ins>color:#FFF;</ins>;display:block;">Some Text</div>'; 
    

    Es gibt nur zwei mögliche Tags nämlich: del und ins. Ich soll diese Tags nicht entfernen, wenn sie nicht innerhalb von Tags sind. Aber müssen sie entfernen, wenn sie in Attributen sind.

    +1

    die Zeichenfolge in DOM parsen, durchlaufen dann die Attribute für Tags mit preg_filter Suche –

    +1

    Müssen Sie nur die Tags entfernen sich oder was sie auch enthalten? I.e. sollte '$ right_string'' @ style' 'color: #FFF ;; display: block;' oder '; display: block;'? –

    +0

    gewünschte Ausgabe für $ right_string wäre: $ right_string = '

    Some Text
    '; Hinweis: Nur innerhalb des Style-Attributs ... aber beachte, dass es sich um ein beliebiges Attribut handeln könnte. – barudo

    Antwort

    1

    Sie können Suche verwenden, indem Sie den folgenden regulären Ausdruck:

    (?<=style=)([\w\W]+)(?:<ins>|<del>)([\w\W\s]+)(?:<\/ins>|<\/del>)([\w\W]*)(?=">) 
    

    Der Wert des Attributs ist der Text, der mit rückwärts Links Titel:

    ([\w\W]+) == $1 
    
    ([\w\W\s]+) == $2 
    
    ([\w\W]*) == $3 
    

    Dann wird diese Kombination geben die erforderlicher Wert für das Attribut:

    $1$2$3 
    

    Für diese Eingabezeichenfolge:

    <div class="class1" style="display:block;">Some Text<del> Orig</del></div> 
    

    Sie das Ergebnis:

    <div class="class1" style="display:block;">Some Text<del> Orig</del></div>

    Für diese Eingabezeichenfolge:

    <div class="class1" style="<ins>color:#FFF;</ins>;display:block;">Some Text</div>

    Sie das Ergebnis:

    <div class="class1" style="color:#FFF;;display:block;">Some Text</div>

    Für diese Eingabezeichenfolge:

    <div class="class1" style=";display:block;<ins>color:#FFF;</ins>">Some Text</div>

    Sie das Ergebnis erhalten:

    <div class="class1" style=";display:block;color:#FFF;">Some Text</div>

    Demo hier ansehen: https://regex101.com/r/3XKv5s/1


    Für jedes Attribut, nicht nur style :

    (?<=[a-zA-Z]=")([\w\W]*)(?:<ins>|<del>)([\w\W\s]*)(?:<\/ins>|<\/del>)([\w\W]*)(?=">) 
    

    Siehe Demo hier: https://regex101.com/r/3XKv5s/2

    +0

    Alkesey, was ist, wenn das Diff auf einem anderen Attribut passiert? Es passiert nicht nur mit Stil. Es könnte auf Klasse, src, etc. sein. – barudo

    +0

    Verwenden Sie positive Lookbehind '[a-zA-Z] =" 'für jedes Attribut. Siehe mein Update. –

    Verwandte Themen