Link entfernen - Regex Code anpassen

SonMiko

Erfahrenes Mitglied
Hallo zusammen,

mit diesem Code:
PHP:
$suchmuster = '#<a (.*)>(.*)</a>#';
$ersetzung = '\2';
$html = preg_replace($suchmuster, $ersetzung, $html);
entferne ich gut funktionierend sämtliche "a" Tags und Links.
Nun will ich das ganze etwas verfeinern und nur noch "a"-tags entfernen
die eine bestimmte Klasse haben. Leider sind meine Regex Kenntnisse begrenzt -
wie gehe ich da am besten vor?
Also beispielsweise "<a class="klasseX" .........>Text</a> soll -> Text ergeben.
 
Durch try and error gelöst:
Code:
'~<a([^>]*)(class\\s*=\\s*["\']glossary["\'])([^>]*)>(.*?)</a>~i'
Wie geht ihr bei Regex Problemen vor?
 
Wie geht ihr bei Regex Problemen vor?

1. Erfahrung ist wie immer das wichtigste

2. Gibt es diverse regex Tester, die einem evtl. weiter helfen (haben noch nie einen benutzt, aber andere schwören darauf) Beispiel: http://www.solmetra.com/scripts/regex/

3. Schritt für Schritt

Code:
//Erst mal ein Beispiel, dass alles enthält, was kommen kann.
//Vor und hinter dem class Attribut können andere Sachen stehen
<a foooooo class="klasseX" baaaar>blah</a>

//Alles was belibig ist durch (.*?) ersetzen
<a (.*?)class="klasseX"(.*?)>(.*?)</a>

//Escapen von Zeichen mit besonderer Bedeutung
<a (.*?)class="klasseX"(.*?)>(.*?)<\/a>

//Ab damit in einen PHP String (eventuell nochmal escapen)
'<a (.*?)class="klasseX"(.*?)>(.*?)<\\/a>'

Tests erstellen

PHP:
<?php
  $rx = '/<a (.*?)class="klasseX"(.*?)>(.*?)<\\/a>/';

  echo preg_replace($rx, '', '<a class="klasseX"></a>');
  echo "\n";
  echo preg_replace($rx, '', '<a class="klasseX">foo</a>');
  echo "\n";
  echo preg_replace($rx, '', 'foo <a class="klasseX">bar</a> baz');
  echo "\n";
  echo preg_replace($rx, '', 'foo <a class="klasseX" style="color:red;">bar</a> baz');
  echo "\n";
  echo preg_replace($rx, '', 'foo <a href="#bacon" class="klasseX" style="color:red;">bar</a> baz');
  echo "\n";
  echo preg_replace($rx, '', 'foo <a href="#bacon" class="klasseX" style="color:red;">bar</a> baz foo <a href="#bacon" class="klasseX" style="color:red;">bar</a> baz');
  echo "\n";
?>

Anstatt der echos wären dann eher asserts oder so angebracht. Keine Ahnung was es in PHP für Unit Test Möglichkeiten gibt.
 
Sehe gerade, dass ein paar Dinge bestimmt besser sein könnten. Z.B. können die Attribute ja auch in einfachen Hochkommas anstatt in Anführungsstrichen stehen. Aber da tut es ja ein einfaches ("|').

Die Feinheiten kannst du ja selbst machen ;-)
 
Zurück