Gero : Regulärer Ausdruck, quasi "p2br"

Hallo Forum,

ich möchte wie folgt zum Beispiel dies hier (INhalt von $inhalt):

<P id="TEST">Hier kommt ein Beispieltext</p>

durch folgendes ersetzen:

Hier kommt ein Beispieltext<br />

Also ähnlich der nl2br-Funktion, nur eben p2br. Wie mache ich das mit einer RegEx?

$inhalt = preg_replace("<P>(.*)</P>", "$1<br />", $inhalt);
                        ^^^^^^^^^^^    ^^^^^^^^

funktioniert gar nicht. Also, noch mal die gewünschten Spezifikationen:
 *  case-insensitiv
 *  Beliebig viele Attribute innerhalb von <P> sollen ebenfalls egal sein.

Bitte, helft mir!

Gruesse
G e r o

  1. Ein ähnliches problem hatt ich auch als ich die bb-code listen in html umsetzen wollte *g*

    ich denk mal es wäre wesentlich einfach die ganze seite mit strpos() zu nach </p> durchsuchen und mit <br /> zu ersetzen, und anschließend alle <p> einfach zu löschen,...

    --
    Auch ein Charmed fan? Zitatsammlung auf Deutsch/Englisch
    1. Hi Montgomery,

      ich denk mal es wäre wesentlich einfach die ganze seite mit strpos() zu nach </p> durchsuchen und mit <br /> zu ersetzen, und anschließend alle <p> einfach zu löschen,...

      nicht, wenn die <p>-Elemente noch zusätzliche Attribute haben. Da muss ein regulärer Ausdruck ran.

      Viele Grüße
       Benjamin

    2. Hi Montgomery,

      ich denk mal es wäre wesentlich einfach die ganze seite mit strpos() zu nach </p> durchsuchen und mit <br /> zu ersetzen, und anschließend alle <p> einfach zu löschen,...

      Wenn dann andersrum, weil manche leute bzw programme machen nur ein <p> und denken, man muss das nicht mehr schließen...

      Gruß, Marian

  2. Hi Gero,

    <P id="TEST">Hier kommt ein Beispieltext</p>
    durch folgendes ersetzen:
    Hier kommt ein Beispieltext<br />
    [...]
    $inhalt = preg_replace("<P>(.*)</P>", "$1<br />", $inhalt);

    • Die Begrenzungszeichen (Delimiter) für den Ausdruck fehlen, oft verwendet man einen Slash.

    *  case-insensitiv

    • Das Flag für case-insensitive ist „i“
    • Flags setzt man hinter den schließenden Delimiter.

    *  Beliebig viele Attribute innerhalb von <P> sollen ebenfalls egal sein.

    • Da kann dein Ausdruck gar nicht matchen, da müssen noch 2 Wildcards hinter das P, nämlich .*

    Versuchs mal hiermit:

      
    $text = '<P id="TEST">Beispieltext</P>';  
    $expr = '/<p.*>(.*)<\/p>/i';  
    $repl = preg_replace($expr, '$1<br />', $text);  
    
    

    Ich empfehle weiterhin dringend die Lektüre von mindestens http://de.selfhtml.org/perl/sprache/regexpr.htm.

    Viele Grüße
     Benjamin

    1. Hi Benjamin,

      Versuchs mal hiermit:

      $text = '<P id="TEST">Beispieltext</P>';
      $expr = '/<p.>(.)</p>/i';
      $repl = preg_replace($expr, '$1<br />', $text);

        
      Du bist mein Retter! ;-) Funktioniert prächtig.  
        
      
      > Ich empfehle weiterhin dringend die Lektüre von mindestens <http://de.selfhtml.org/perl/sprache/regexpr.htm>.  
        
      Schon gebookmarkt und zur Lektüre vorgesehen ;-)  
        
      Danke vielmals,  
      Gero
      
  3. Hi,
    hab hier mal ne beispiel funktion, ist sicher nicht das gelbe vom ei, zumal sie nur einen durchlauf macht aber mal ein anfang.

      
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">  
    <html>  
      <head>  
        <title>New Document</title>  
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">  
      </head>  
      <body>  
    
    
      
    <?  
        $zeile = '<P id="TEST">Hier kommt ein Beispieltext</P>';  
        echo $zeile;  
        function p2br($string)  
        {  
          $position_start = strpos($string, "<P");  
          if($position_start === 0 || $position_start >= 1)  
          {  
            $position_ende = strpos($string, ">");  
            while($position_ende < $position_start)  
            {  
              $string = substr_replace($string, "[dreieckzu]", $position_ende, 1);  
              $position_ende = strpos($string, ">");  
              $position_start = strpos($string, "<P");  
            }  
            $laenge = $position_ende-$position_start+1;  
            $string = substr_replace($string, "", $position_start, $laenge);  
            $string = str_replace("</P>", "<br />", $string);  
            $string = str_replace("[dreieckzu]", ">", $string);  
          }  
          return $string;  
        }  
        $zeile = p2br($zeile);  
        echo $zeile;  
        ?>  
    
    
      
      </body>  
    </html>  
    
    
    1. Hi,

        
      function p2br($string)  
      {  
        $position_start = strpos($string, "<P");  
        if($position_start === 0 || $position_start >= 1)  
        {  
          $position_ende = strpos($string, ">");  
          while($position_ende < $position_start)  
          {  
            $string = substr_replace($string, "[dreieckzu]", $position_ende, 1);  
            $position_ende = strpos($string, ">");  
            $position_start = strpos($string, "<P");  
          }  
          $laenge = $position_ende-$position_start+1;  
          $string = substr_replace($string, "", $position_start, $laenge);  
          $string = str_replace("</P>", "<br />", $string);  
          $string = str_replace("[dreieckzu]", ">", $string);  
          $string_return = p2br($string);  
          if(!$string_return)  
          {  
            return $string;  
          }  
          else  
          {  
            return $string_return;  
          }  
        }  
        return false;  
      }  
      
      

      diese funktion ersetzt beliebig viele p's ist kein p vorhanden wird false zurueckgegeben deshalb empfiehlt sich der aufruf über

        
      $zeile_neu = p2br($zeile);  
      if(!$zeile_neu)  
      {  
        // keine p's  
      }  
      else  
      {  
        // in $zeile neue sind die p's durch br's ersetzt  
      }  
      
      

      Der code ist sicherlich noch verbesserungswürdig, vll kommt von dem einen oder andern noch was.

      MfG

      1. Hi Daniel,

        [ganz viel Quellcode]

        wozu das Rad neu erfinden?

        Viele Grüße
         Benjamin