• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Leerzeichen in Links entfernen

Icy

Neues Mitglied
Hallo,

ich häng grad an einem Punkt.
In meinem Gästebuch lese ich alle Einträge ausd er Datenbank aus. Vor dem Anzeigen breche ich allerdings überlange Wörter mit einer Funktion ab; heißt ab 30 Zeichen ohne Unterbrechung wird ein Leerzeichen dazwischengesetzt.
Mein Problem ist, dass lange Links auch unterbrochen werden, was natürlich nicht Sinn der Sache ist.
In der Datenbank steht dann z. B. zwischendurch so ein Link:

HTML:
<a href="http://www.google.de/search?hl=de &source=hp&q=blabla+ganz+toll&btnG=Google-Suche&meta=&aq=f &oq=" target="_blank">[url=http://www.google.de]Google[/url] /search?hl=de&source=hp&q=blabla+ganz+toll &btnG=Google-Suche&meta=&aq=f& oq=</a>

Wie ihr seht, ist alles durchsäht von Leerzeichen. Ich bekomme es einfach nicht hin, alle Leerzeichen im href-Attribut zu entfernen.
Hat jemand einen Denkanstoß für mich?

MfG Icy
 
Zuletzt bearbeitet:
Werbung:
einfach mit str_replace() nach leerzeichen suchen und sie ersetzen. kann sein, dass du es durch rawurlencode() jagen musst, um die als leerzeichen interpretierten %20 auch tatsächlich als leerzeichen erkennen zu können.

kürzen mach' ich immer mit substr() bei der ausgabe, dann entstehen keine komplikationen oder schönheitsfehler.

Nils aka XraYSoLo
 
Das Problem ist aber, dass ich ja nicht die einzelnen Links habe, sondern nur den kompletten Eintrag. Wenn ich da mit str_replace() arbeiten, sind natürlich alle Leerzeichen weg und nicht nur die in den Links :)

MfG Icy
 
Werbung:
Außer in absoluten Ausnahmefällen (siehe letzte Zeile des Tests) sollte das mit einem regulären Ausdruck zu machen sein:

PHP:
<?php

header('Content-type: text/plain; charset=utf-8');

$test = <<<EOT
<a href="http://www.google.de/search?hl=de &source=hp&q=blabla+ganz+toll&btnG=Google-Suche&meta=&aq=f &oq=" target="_blank">Dies ist ein Test</a>
test 1234 rtersers
<a title="Eine schöne URL" id="test" href="noch ein test">noch ein test</a>
<a href='www. test. de'>bla</a>
<a title="href='das hier lässt sich nur relativ kompliziert verhindern'" href="eins zwei">Bug?</a>
EOT;

echo "Vorher:\n\n" . $test . "\n\n";

$pattern = '#(<a.*?href=)("|\')(.*?)(\2[^>]*>)#s';

function cb($matches)
{
    return $matches[1] . $matches[2] . str_replace(' ', '', $matches[3])
           . $matches[4];
}

$test = preg_replace_callback($pattern, 'cb', $test);

echo "Nachher:\n\n" . $test . "\n\n";
 
edit:
der code oben ist schöner, nehme meinen wieder raus...
 
Zuletzt bearbeitet von einem Moderator:
Werbung:
Das ist übrigens ein Anwendungsfall, der schön die Grenzen von Regex aufzeigt. (Und die Tatsache, dass man manche Dinge beliebig verkomplizieren kann. ;))

Denkbar wäre nämlich auch sowas:

HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title>test</title></head>
<body>
<p>
'<a title='<a title=">x</a>" href="a b">' href="FOO BAR"></a>'
<![CDATA['<a title='<a title=">x</a>" href="a b">' href="a b"></a>']]>
<!--<a title='<a title=">x</a>" href="a b"></a>' href="a b">-->
</p>
</body>
</html>

Der W3C-Validator sagt, der Code ist okay. Das heißt, es dürfte nur das Leerzeichen zwischen "FOO" und "BAR" entfernt werden. (Ich habe allerdings keine genauen Infos darüber gefunden, ob HTML -- nicht XHTML -- Winkelklammern in Attributen erlaubt.)

Wie man sieht, ist der Syntax-Highlighter hier im Forum schon aus dem Rennen. Mein Texteditor (Kate) highlightet korrekt, markiert aber die öffnenden Winkelklammern ("<") als Fehler.

Falls jemand mit dem Gedanken spielt, dafür einen Parser schreiben zu wollen: Auch dieser HTML-Code scheint valide zu sein (Quelle, bekommt auch Kate nicht mehr auf die Reihe):

HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<>
<title//
<p ltr<span></span</p>
</>

Wäre mal interessant, herauszufinden, ob die zweifellos existierenden PHP-HTML/DOM-Parser dieses Markup schaffen.
 
Zurück
Oben