berdn: RegExp geht das besser?

Hallo Forum,

da reguläre Ausdrücke immer noch sehr neu für mich sind,
Hier Aufgabe und meine Lösung.

Bei allen Links die in einer Textvariablen sind, mal einen Dummy gebaut, soll der erste und nur der erste Buchstabe unterstrichen sein.

Das style werde ich natürlich noch durch eine klasse definieren.
Und auch keine Diskussuion um den Sinn oder Unsinn über diese Anforderung.

Liebe Grüße,

Bernd

<?PHP
$myString ='<div id="myNavigationList">'."\n";
$myString = $myString.'<ul id="navList">'."\n";
$myString = $myString.' <li><strong><a href="#">kognito gestaltung</a></strong></li>'."\n";
$myString = $myString.' <li><a href="Feature_cs/index.php" title="Feature">Feature</a></li>'."\n";
$myString = $myString.' <li><a href="profil_cs/index.php" title="Profil">Profil</a></li>'."\n";
$myString = $myString.' <li><a href="projekte_cs/index.php" title="Projekte">Projekte</a></li>'."\n";
$myString = $myString.' <li><a href="publikationen_cs/index.php" title="Publikationen">Publikationen</a></li>'."\n";
$myString = $myString.' <li><a href="kontakt_cs/index.php" title="Kontakt">Kontakt</a></li>'."\n";
$myString = $myString.'</ul>'."\n";
$myString = $myString.'</div>'."\n";

// die Callback-Funktion
function firstLetterUnderline($treffer){
return $treffer[1]."<span style="text-decoration:underline">".$treffer[2]."</span>".$treffer[3].$treffer[4];
}
$myString = preg_replace_callback( "|(<a.*>)([a-zA-Z0-9])(.*)(</a>)|", "firstLetterUnderline",$myString);

echo($myString);
?>

  1. hi,

    Bei allen Links die in einer Textvariablen sind, mal einen Dummy gebaut, soll der erste und nur der erste Buchstabe unterstrichen sein.

    ja, das könnte durchaus besser - und auch viel einfacher - gehen, wenn man dazu gar nicht mittels regex o.ä. ins HTML eingreift, sondern CSS dafür benutzt: dafür existiert schießlich das pseudoformat :first-letter.

    (allerdings bin ich mir nicht sicher, ob sich _alle_ CSS-formatierungen damit auf den ersten buchstaben anwenden lassen, noch ob alle browser das mitmachen.
    aber ein text-decoration:underline, border-bottom oder auch ein positioniertes hintergrundbild mit einer linie sollten m.E. möglich sein.)

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hi,

      ja, das könnte durchaus besser - und auch viel einfacher - gehen, wenn man dazu gar nicht mittels regex o.ä. ins HTML eingreift, sondern CSS dafür benutzt: dafür existiert schießlich das pseudoformat :first-letter.

      (allerdings bin ich mir nicht sicher, ob sich _alle_ CSS-formatierungen damit auf den ersten buchstaben anwenden lassen, noch ob alle browser das mitmachen.

      These are the properties that apply to :first-letter pseudo-elements: font properties, color properties, background properties, 'text-decoration', 'vertical-align' (only if 'float' is 'none'), 'text-transform', 'line-height', margin properties, padding properties, border properties, 'float', 'text-shadow', and 'clear'.

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      Schreinerei Waechter
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      1. Hallo Listies,

        war gestern dann doch zu sehr im Stress ...
        Das mit First Letter hatte ich versucht, aber das funktionierte bei mir nur im <p> Tag. Mit <a> ging es nicht.

        Und <li><a><p>Text</p></a></li> ist doch nicht erlaubt oder?

        Ja, im Moment bin ich mit meinen Suchmuster zufrieden, da es auch die Links in den Texten betrifft ...

        Ansonsten merke ich schon, das ich mich noch mehr mit RegEx beschäftigen muß.

        Liebe Grüße,

        bernd

        1. Hi,

          war gestern dann doch zu sehr im Stress ...
          Das mit First Letter hatte ich versucht, aber das funktionierte bei mir nur im <p> Tag. Mit <a> ging es nicht.

          The :first-letter pseudo-element matches parts of block-level elements only.
          http://www.w3.org/TR/REC-CSS2/selector.html#img-first-letter2

          Insofern wäre der Browser kaputt, wenn a:first-letter funktionieren würde, ohne daß der Link ein blocklevel-Element wäre.

          Und <li><a><p>Text</p></a></li> ist doch nicht erlaubt oder?

          Nö, natürlich nicht. Aber wozu noch ein block-Element in den Link packen, wenn Du schon ein block-Element außenrum hast?

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          Schreinerei Waechter
          Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
          1. Hi,

            Hi,

            war gestern dann doch zu sehr im Stress ...
            Das mit First Letter hatte ich versucht, aber das funktionierte bei mir nur im <p> Tag. Mit <a> ging es nicht.

            The :first-letter pseudo-element matches parts of block-level elements only.
            http://www.w3.org/TR/REC-CSS2/selector.html#img-first-letter2

            Insofern wäre der Browser kaputt, wenn a:first-letter funktionieren würde, ohne daß der Link ein blocklevel-Element wäre.

            Und <li><a><p>Text</p></a></li> ist doch nicht erlaubt oder?

            Nö, natürlich nicht. Aber wozu noch ein block-Element in den Link packen, wenn Du schon ein block-Element außenrum hast?

            cu,
            Andreas

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            Schreinerei Waechter
            Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
          2. Hallo Andreas,

            das mit dem Blockelement ist mir ja schon klar, aber die Aufgabe war den ersten Buchstaben zu unterstreichen. Und das geht ja wie Du schon geschrieben hast nicht nur mit CSS. Deshalb mein Ansatz mit RegExp  einen zusätlichen span zu schreiben.

            Liebe Grüße,

            Bernd

            1. Hi,

              das mit dem Blockelement ist mir ja schon klar, aber die Aufgabe war den ersten Buchstaben zu unterstreichen. Und das geht ja wie Du schon geschrieben hast nicht nur mit CSS.

              Natürlich geht das nicht nur mit CSS, sondern auch mit anderen Methoden wie zusätzlichen spans.
              Aber wozu andere Methoden verwenden, wenn es mit CSS wunderbar geht?

              Deshalb mein Ansatz mit RegExp  einen zusätlichen span zu schreiben.

              Non sequitur.

              cu,
              Andreas

              --
              Warum nennt sich Andreas hier MudGuard?
              Schreinerei Waechter
              Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
              1. Hallo Andreas,

                weil die Texte incl. fertig aus einer Datenbank kommen.
                Und es funktioniert hervorragend mit span ;-)

                Nur leider muß ich dann dieses Span dann dynamisch schreiben, deshalb meinen Ansatz mit RegExp.

                Liebe Grüße,

                Bernd

                1. Hallo.

                  weil die Texte incl. fertig aus einer Datenbank kommen.

                  Und?

                  Nur leider muß ich dann dieses Span dann dynamisch schreiben, deshalb meinen Ansatz mit RegExp.

                  Du musst gar nichts dynamisch schreiben.
                  MfG, at

    2. Lieber wahsaga,

      ... soll der erste und nur der erste Buchstabe unterstrichen sein.

      ja, das könnte durchaus besser - und auch viel einfacher - gehen, wenn man dazu gar nicht mittels regex o.ä. ins HTML eingreift, sondern CSS dafür benutzt: dafür existiert schießlich das pseudoformat :first-letter.

      er braucht aber nicht nur :first-letter sondern auch :last-letter, aber :last-letter kannst Du ihm nicht anbieten!

      Liebe Grüße aus Ellwangen,

      Felix Riesterer.

      1. Hallo Felix,

        er braucht aber nicht nur :first-letter sondern auch :last-letter,

        ähh... warum? er möchte doch den 1. Buchstaben unterstreichen, oder?

        Grüße aus Nürnberg
        Tobias

  2. Lieber berdn (sic!),

    $myString = preg_replace_callback( "|(<a.*>)([a-zA-Z0-9])(.*)(</a>)|", "firstLetterUnderline",$myString);

    Das erscheint mir unzuverlässig! (<a.*>) ist von sich aus sehr gefräßig, so dass es auch einen String wie '<a href="#">Link</a>' matchen würde. Jedenfalls sehe ich keinen Schalter für non-greedy in Deinem Suchmuster. Die dritte Backreference ist auch problematisch: (.*) matched alles! ich könnte mir vorstellen, dass Dein Suchmuster nur den ersten Link verändern wird, da alle restlichen Links im dritten Klammerpaar hineinpassen.

    Aber ob Dein Suchmuster seinen Zweck erfüllt, oder nicht, das hast Du uns ja nicht verraten... Jedenfalls lese ich bei Dir keine Beschwerden über nichtgewolltes Verhalten Deines Scriptes.

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.