2010-05-14 8 views
5

Ich weiß, dass:php: trim Br-Tags vom Anfang einer Zeichenfolge?

preg_replace('<br\s*\/?>', '', $string); 

alle br Tags von $ string entfernen ...

Wie können wir alle <br><br/><br />-Tags nur entfernen, wenn sie in der ersten Stunde von $ string sind? ($ String in meinem Fall ist HTML-Code mit verschiedenen Tags ...)

Antwort

16

einfach einen geeigneten Anker hinzufügen (^):

preg_replace('/^(?:<br\s*\/?>\s*)+/', '', $string); 

Dies wird mehrere <br> s am Anfang der Zeichenfolge Übereinstimmen .

(?:…) ist ein Nicht-Erfassung Gruppe, da wir nur die Klammern hier verwenden den Ausdruck Gruppe, ist es nicht zu erfassen. Der Modifikator ist nicht unbedingt notwendig - (…) würde genauso gut funktionieren, aber die Engine für reguläre Ausdrücke müsste mehr Arbeit leisten, weil sie sich dann an die Position und Länge jedes erfassten Treffers erinnern muss.

+0

Sie brauchen Begrenzer um Ihre Regex und da nichts erfasst werden muss, verwenden Sie eine nicht-einfangende Gruppe '(?: ...)' – salathe

+0

@salathe: Yup ... Ich habe sie hinzugefügt. Ich habe den Code der Frage zuerst kopiert, deshalb habe ich sie vergessen. - Und die nicht-einfangende Gruppe ist auch eine gute Idee. –

+0

danke für den Anker Tipp, das ist, was ich vermisste ... Ihre Regex entfernt nicht alle Vorkommen, sondern kombiniert mit diesem Beitrag: http://StackOverflow.com/Questions/133571/How-to-convert-multiple-br -tag-zu-eins-br-tag-in-php die richtige regex sollte sein/^ ( \ s *) +/ ändern sie es und ich werde die antwort als akzeptiert – Thanos

4

Sie haben die delimiters for PCRE in Ihrem regulären Ausdruck vergessen. Versuchen Sie folgendes:

$string = preg_replace('/^\s*(?:<br\s*\/?>\s*)*/i', '', $string); 

Dies entfernt auch vor Leerzeichen führt, zwischen und nach den Zeilenumbrüche.

Einige Erklärung:

  • ^\s* wird
  • (?:<br\s*\/?>\s*)* wird null oder mehr Vorkommen von BR Tags durch optionale Leerzeichen (beide HTML und XHTML)
  • zu Beginn der Zeichenfolge keine Leerzeichen entsprechen gefolgt entsprechen
2
$string = preg_replace('@^(<br\\b[^>]*/?>)[email protected]', '', $string); 

Sollte entsprechen:

<br> 
<br/> 
<br style="clear: both;" /> 
etc 
+0

Vorsicht jetzt - der Fragesteller wollte, dass er an einer bestimmten begrenzten Menge von HTML arbeitet, was es erlaubt [Cthulu] (http: // stackoverflow.com/questions/1732348/regex-match-open-tags-außer-xhtml-in sich geschlossene-tags). Wahnsinn liegt im Pfad deines "etc". :) Obwohl ich zustimme,
ist häufig genug zu prüfen, so upvoted. – Jerph

+0

Das scheint für das zu funktionieren, wonach ich gesucht habe. Funktioniert das auf einem legitimen '
' Tag? – qitch

Verwandte Themen