zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden Regex Problem ("]" killt die regex)

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 28.04.2007, 18:23
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 26.10.2004
Beiträge: 990
psycho_dmr befindet sich auf einem aufstrebenden Ast
Standard Regex Problem ("]" killt die regex)

Code:
$str = preg_replace('/((\$l\[)([^]]*?)[\]])(.*?)(\$l)/i','<a href="'.checktm2htmlurl("\\3").'">\\4</a>',$str);
ich versuche mit der regex aus der syntax $l[url]linktext$l einen normalen HTMLlink zu machen, leider killen [ und ] in der URL diese Regex und ich hab nicht wirklich ne ahnung, wie ich das beheben kann :/ (benutze preg_replace und das problem liegt nicht in der checktm2htmlurl())


also aus
$l[google.de?search=[foo]bar]suche nach [Foo]bar!$l
wird nicht, wie es sollte
<a href="http://google.de?search=[foo]bar">suche nach [Foo]bar!</a>
sondern
<a href="http://google.de?search=[foo">bar]suche nach [Foo]bar!</a>

kann mir da jemand helfen?

mfg psy-

p.s. =test]test
__edit: das kann das forum hier ja auch nicht
__________________
Wer sich über Kritik ärgert, gibt zu, dass sie verdient war.
Gaius Cornelius Tacitus (um 55 - nach 115), römischer Historiker und Politiker

Geändert von psycho_dmr (28.04.2007 um 18:27 Uhr) Grund: das kann das forum hier ja auch nicht
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 28.04.2007, 19:39
Benutzerbild von fox
fox fox ist offline
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 11.09.2006
Beiträge: 1.011
fox sorgt für eine eindrucksvolle Atmosphärefox sorgt für eine eindrucksvolle Atmosphäre
Standard

Ich kenne relativ wenig Adressen, in denen die Zeichen [ und ] vorkommen.

Allerdings kannst du den Link vor dem Umwandeln URL-Kodieren (url_encode()) - und dann die RegExp entsprechend anpassen.

Der RegExp-Evaluator - RegExp-Evaluator <- Hilft auch dabei
__________________
:)
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 28.04.2007, 20:10
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 26.10.2004
Beiträge: 990
psycho_dmr befindet sich auf einem aufstrebenden Ast
Standard

"relativ wenig" sind bei 1000 urls immernoch ca 50... aber darum gehts hier eh nicht
und umwandeln kann ich den link nicht, da ich den string ja so bekomme, wie er ist...
__________________
Wer sich über Kritik ärgert, gibt zu, dass sie verdient war.
Gaius Cornelius Tacitus (um 55 - nach 115), römischer Historiker und Politiker
Mit Zitat antworten
  #4 (permalink)  
Alt 29.04.2007, 03:07
Benutzerbild von Pablo
4 8 15 16 23 42
XHTMLforum-Kenner
 
Registriert seit: 31.05.2004
Beiträge: 1.773
Pablo sorgt für eine eindrucksvolle AtmosphärePablo sorgt für eine eindrucksvolle Atmosphäre
Standard

Hi psycho,

lassen wir das praktische Problem erst mal weg und versuchen es in der Theorie:
Du hast folgenden String:
$l[google.de?search=[foo]bar]suche nach [Foo]bar!$l
Für einen Menschen ist das ganze so weit klar, dass "google.de?search=[foo]bar" die URI und "suche nach [Foo]bar!" die Beschriftung ist.
Und zwar ist uns das klar weil es - unüblich - wäre eine Bezeichnung "bar]suche nach [Foo]bar!" zu benennen. Rein logisch aber durchaus völlig korrekt. Wir als Menschen erkennen also wie das richtig aussehen muss, nur aus reiner Gewohnheitssache weil es unsere Sprache so vorschreibt und wir es nicht anders kennen.

Folglich bleiben dir zwei Möglichkeiten:
Ein mal kannst du dem PC beibringen in gewisser Weise logisch zu denken und solche Sachen selbstständig entscheiden zu können. Problem an der Sache ist der gewaltige Programmieraufwand und dass diese Problemlösung am Ziel vorbeischießen würde. Also weg mit der Idee.

Andere Möglichkeit: Die Syntax ändern. Wenn rein logisch zwei gleichwertige Möglichkeiten bestehen eine Sache zu lösen, musst du so lange an den vorraussetzungen herumschrauben bis nur noch eine eindeutige Lösungsmöglichkeit besteht.
Also den User nicht erlauben [ und ] zu benutzen in URIs, bzw. diese bereits im geschriebenen Code durch %5B und %5D ersetzen.

Wie dem auch sei... So wie du es wünschst geht es technisch und logisch nicht. Egal wie lang du rumschraubst.

Schade eigentlich.

Das SELFHTML Forum welches ich technisch als eines der einwandfreisten bezeichnen würde hat für dieses Phänomen eine Lösung. Links in denen unkodiert ein [ vorkommt werden nicht geparsed. Kommt ein ] vor wird der Link an dieser Stelle beendet. Ganz einfach.

Gruß,
Pablo
__________________
Go Opera!
… oder Chrome. Auch cool.
Mit Zitat antworten
  #5 (permalink)  
Alt 29.04.2007, 10:48
Benutzerbild von netspy
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 13.08.2004
Ort: Leipzig
Beiträge: 1.956
netspy sorgt für eine eindrucksvolle Atmosphärenetspy sorgt für eine eindrucksvolle Atmosphäre
Standard

Für dieses Problem brauchst du zwei reguläre Ausdrücke. Im ersten Schritt musst du davon ausgehen, dass [foo] in der URL vorkommen und entsprechend danach suchen:

PHP-Code:
preg_replace('~\$l\[(.*\[.*\][^]]*)\](.*)\$l~iU''<a href="\1">\2</a>'$str); 
Wenn du damit nichts gefunden hast, suchst du nach URLs ohne [foo]:

PHP-Code:
preg_replace('~\$l\[([^]]*)\](.*)\$l~iU''<a href="\1">\2</a>'$str); 
Problematisch wird es nur, wenn mehrere [foos] in der URL vorkommen können.

Mario
__________________
AppDev Blog · AppDev Forum
Mit Zitat antworten
  #6 (permalink)  
Alt 29.04.2007, 14:28
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 26.10.2004
Beiträge: 990
psycho_dmr befindet sich auf einem aufstrebenden Ast
Standard

also es geht nicht, schade :/

Aarakast: ich kann den string nicht zerschnibbeln oder die url vorher codieren, da ich den string als solchen bekomme, hab ich ja aber auch oben schon geschreiben.

netspy deine regex ist leider auch keine lösung, da es durchaus sein kann, dass es mehrere [foos] in der url gibt... und wenn die dann den parser killt, esses auch egal ein ein [foo] den parser killt...
__________________
Wer sich über Kritik ärgert, gibt zu, dass sie verdient war.
Gaius Cornelius Tacitus (um 55 - nach 115), römischer Historiker und Politiker
Mit Zitat antworten
  #7 (permalink)  
Alt 29.04.2007, 15:10
Benutzerbild von netspy
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 13.08.2004
Ort: Leipzig
Beiträge: 1.956
netspy sorgt für eine eindrucksvolle Atmosphärenetspy sorgt für eine eindrucksvolle Atmosphäre
Standard

Wenn mehrere [foos] vorkommen können, kommst du mit einem einfachen regulärem Ausdruck nicht weiter. Dazu musst du schon irgendwie die Klammern zählen - entweder durch PHP-Code im RegEx oder (vermutlich einfacher) indem du den String selbst zerlegst und dort die passenden Teile raussuchst.

Mario
__________________
AppDev Blog · AppDev Forum
Mit Zitat antworten
  #8 (permalink)  
Alt 29.04.2007, 16:49
Benutzerbild von Pablo
4 8 15 16 23 42
XHTMLforum-Kenner
 
Registriert seit: 31.05.2004
Beiträge: 1.773
Pablo sorgt für eine eindrucksvolle AtmosphärePablo sorgt für eine eindrucksvolle Atmosphäre
Standard

Hi,

aaalso.. wenn die Klammern nicht verschachtelt ([foo[bar]foo]) sind, sondern einfach nur aufeinander folgen ([foo][bar][foo]) dann geht folgendes Script mit beliebig vielen Klammerpaaren:

Code:
$str = '$l[google.de?search=[foo][foo]bar]suche nach [Foo]bar!$l';
$str = str_replace('$l', '', $str);
$str = substr($str, 1);
$split = first_nonopened_bracket($str);
print '&lt;a href="' . substr($str, 0, $split) . '"&gt;' . substr($str, ($split + 1)) . '&lt;/a&gt;';
function first_nonopened_bracket($haystack) {
  $found = false;
  $rest = $haystack;
  $pos = 0;
  while($found == false) {
    if(strpos($rest, '[') < strpos($rest, ']')) {
      $rest = substr($rest, (strpos($rest, ']') + 1));
      $pos += (strpos($rest, ']') + 1);
    }
    else {
      $found = true;
      return $pos += strpos($haystack, ']');
    }
  }
}
Ist vielleicht nicht das einfachste, aber da ich veruscht habe das möglichst global zu machen wurd das was komplizierter... Klappte aber nicht komplett ^^ Vielleicht arbeite ich morgen weiter.

Und jetzt erst mal lecker grillen

Gruß,
Pablo
__________________
Go Opera!
… oder Chrome. Auch cool.
Mit Zitat antworten
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Mitwachsender Content und Footer Problem Bentham CSS 5 19.09.2010 11:49
Problem: IE versteckt Text & Feedback Herbi CSS 2 11.08.2006 14:39


Alle Zeitangaben in WEZ +2. Es ist jetzt 13:31 Uhr.