php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2005

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 04.05.2005, 18:06  
Benutzer
 
Registriert seit: 31.08.2004
Beiträge: 61
RoDa
Standard Problem mit Back Reference in preg_replace

Hallo

Ich bin daran, mich mit regulären Ausdrücken zu beschäftigen, und dachte, ich mach mal eine Testdatei mit einer Art Wiki: Wenn in einem String ein Wikiwort gefunden wird (also Beginn mit einem Grossbuchstaben, dann beliebige Anzahl Kleinbuchstaben, dann wieder ein Grossbuchstabe, dann wieder beliebige Anzahl Kleinbuchstaben; Bsp: WikiWort), soll das Wikiwort mit einem Link versehen werden, der die Datei selbst aufruft und das Wort als Variable übergibt. Folgendes hab ich gebastelt:

PHP-Code:
<?php
$string
="Das ist mein Text, der hat ein WikiWort und noch eins: HyperText!";
$regex="(\b[A-Z|Ä|Ö|Ü][a-z|ä|ö|ü]+[A-Z|Ä|Ö|Ü][a-z|ä|ö|ü]+\b)";
$wikistring preg_replace($regex"<a href=\"".$_SERVER['PHP_SELF']."?w=\1\">\1<a>"$string);
echo 
"Das ist der WikiString: ".$wikistring."
"
;
?>
Die Ausgabe sieht leider so aus:

Das ist mein Text, der hat ein  und noch eins: !

Dabei sind die  tatsächlich Links, aber so:
http://www.domain.ch/wiki.php?w=
Was mache ich falsch, dass mir nicht das gefundene (das wird es ja, denn schliesslich wird es ersetzt) Wort, sondern ein  angezeigt wird?

Besten Dank im Voraus für eure Hilfe.

RoDa
RoDa ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 04.05.2005, 18:10  
Gast
 
Beiträge: n/a
Standard

\\1
 
Alt 04.05.2005, 18:17  
Benutzer
 
Registriert seit: 31.08.2004
Beiträge: 61
RoDa
Standard \\1

Hallo meikel

Also so:
PHP-Code:
<?php
$wikistring 
preg_replace($regex"<a href=\"".$_SERVER['PHP_SELF']."?w=\\1\">\\1<a>"$string);
?>
Hab ich auch schon versucht (übrigens auch schon mit $1), dann krieg ich aber gar nichts, nicht mal einen falschen Link:

Das ist mein Text, der hat ein und noch eins: !

Der Fehler muss also (noch) an einem anderen Ort liegen?!
RoDa ist offline  
Alt 04.05.2005, 18:32  
Gast
 
Beiträge: n/a
Standard

http://test.php-help.info/regexp-12/ (Quelltext wird angezeigt)

Es gibt dabei allerings das Problem, daß der Wert von w rawurlencodet werde muß, wenn Umlaute enthalten sind. Es wäre daher besser, Du verwendest preg_replace_callback().
 
Alt 04.05.2005, 18:41  
Benutzer
 
Registriert seit: 31.08.2004
Beiträge: 61
RoDa
Standard klappt!

Hallo meikel

So funktionierts. Ich weiss zwar nicht genau, warums jetzt geht, und ich verstehe weder "rawurlencodet" noch "preg_replace_callback()", aber ich werde mich schlau machen.

Danke für das übersichtliche Beispiel!!
RoDa
RoDa ist offline  
Alt 04.05.2005, 19:05  
Gast
 
Beiträge: n/a
Standard Re: klappt!

Zitat:
Zitat von RoDa
Ich weiss zwar nicht genau, warums jetzt geht,
1. keine delimiter
2. entweder "\\\\1" oder '\\1'
3. im pattern string ein paar + vergessen.

Zitat:
und ich verstehe weder "rawurlencodet" noch
Das war Denglisch. http://de.php.net/rawurlencode

Zitat:
Gibt eine Zeichenkette zurück, in der alle Sonderzeichen ausser -_.
durch ein Prozent-Zeichen (%), gefolgt von einer 2-stelligen hexadezimalen Zahl, ersetzt worden sind. Dies ist die Kodierung nach RFC 1738 zum Schutz von Zeichen, die als spezielle URL-Trennzeichen zu interpretieren sind oder die vor einer Umwandlung durch Übertragungs-Medien mit Zeichen-Konvertierung (z.B. einige E-Mail-Systeme) bewahrt werden sollen.
Zusatz:
Umlaute gelten als Sonderzeichen.

Zitat:
"preg_replace_callback()",
http://de.php.net/preg_replace_callback

Zitat:
aber ich werde mich schlau machen.
Fein.
 
Alt 06.05.2005, 16:12  
Benutzer
 
Registriert seit: 31.08.2004
Beiträge: 61
RoDa
Standard preg_replace_callback

O.K., meikel, danke für die Erklärungen.

Ich hab versucht, mich schlau zu machen.

1 & 2 hab ich gerafft.

Bei 3 täuschst du dich meines Erachtens bei den +: So machst du den String:
PHP-Code:
<?php
$regex  
"°(\b[A-Z|Ä|Ö|Ü]+[a-z|ä|ö|ü]+[A-Z|Ä|Ö|Ü]+[a-z|ä|ö|ü]+\b)°U";
?>
Damit werden aber nicht nur WikiWörter angezeigt, sondern auch WIkiWÖrter, und das wollte ich ja nicht. Also kann nach der Definition der Grossbuchstaben das + fehlen, oder?

Was ich nicht kapiere (und auch nicht schlauer geworden bin durch das, was ich drüber gefunden habe), ist das U für ungreedy am Schluss. All die Beispiele waren nicht gerade hilfreich. Egal: Ich spar mir das weitere Verstehen von ungreedy momentan auf.

rawurlencode hab ich verstanden, hingegen happerts mit preg_replace_callback, was du mir geraten hast. Verstanden hab ich - glaub ich zumindest -, dass das Ersetzungsmuster sozusagen in eine Funktion ausgelagert wird. Ich habs mal so versucht:
PHP-Code:
<?php
function machlink($treffer)
{
return 
sprintf('<a href="%s?w='.$treffer[1].'">'.$treffer[1].'<a>'$_SERVER['SCRIPT_NAME']);
}
    
$regex  "°(\b[A-Z|Ä|Ö|Ü][a-z|ä|ö|ü]+[A-Z|Ä|Ö|Ü][a-z|ä|ö|ü]+\b)°U"
$wikistring preg_replace_callback($regex"machlink"$text); 
echo 
$wikistring;
?>
Hat geklappt. Dann hab ich mir gedacht, wenn das Ganze in einer Funktion ist, sollte man ja auch Bedingungen setzen können. Z.B. soll ein Wort nur gelinkt werden, wenn es in einer Wortliste vorkommt, also z.B. durch folgende Funktion:
PHP-Code:
<?php
$linkliste
="WikiWort BlaBla";
function 
machlink($treffer)
    {
    if(
strpos($linkliste$treffer)===false)
        {
        return 
$treffer[1];
        }
    else
        {
        return 
sprintf('<a href="%s?w='.$treffer[1].'">'.$treffer[1].'<a>'$_SERVER['SCRIPT_NAME']);
        }
    }
?>
Ich habe alles mögliche zu ändern versucht: kontrollieren ob true (dann mit verkehrten Befehlen, kontrollieren ob Zahl >0, Indizes ergänzt und gelöscht $treffer[1] / $treffer usw.
Daher zwei Fragen:
1. Geht das überhaupt mit if in der Callback-Funktion?
2. Wenn ja: Wo liegt mein Fehler?

Ich wäre wieder mal dankbar für jegliche Tipps.

RoDa
RoDa ist offline  
Alt 06.05.2005, 16:23  
Gast
 
Beiträge: n/a
Standard Re: preg_replace_callback

Zitat:
Zitat von RoDa
Damit werden aber nicht nur WikiWörter angezeigt, sondern auch WIkiWÖrter, und das wollte ich ja nicht.
Ich habe ehrlich gesagt keine Ahnung, was ein wikiwort ist...

Zitat:
Also kann nach der Definition der Grossbuchstaben das + fehlen, oder?
1.
Code:
Tabelle 2. Single-character quantifiers

* equivalent to {0,} 
+ equivalent to {1,} 
? equivalent to {0,1}
2. eine Klasse wird mit [] eingerahmt.
Das macht meines Erachtens wenig Sinn:
[A-Z...][a-z...]

Da ich nicht genau weiß, nach welchem Muster Du GENAU suchen willst, muß ich passen.

Ggf. das
[A-Z...]{1,1}[a-z...]+
und nach dem + fehlen mir allerdings die weiteren Infos.
 
Alt 06.05.2005, 16:29  
Gast
 
Beiträge: n/a
Standard Re: preg_replace_callback

Teil 2
Da kenne ich mich dann schon etwas besser aus
Zitat:
Zitat von RoDa
Was ich nicht kapiere (und auch nicht schlauer geworden bin durch das, was ich drüber gefunden habe), ist das U für ungreedy am Schluss.
U = "un-gierig". Blödes Wort.

Zitat:
rawurlencode hab ich verstanden, hingegen happerts mit preg_replace_callback, was du mir geraten hast. Verstanden hab ich - glaub ich zumindest -, dass das Ersetzungsmuster sozusagen in eine Funktion ausgelagert wird. Ich habs mal so versucht:
Ich korrigiere mal:
PHP-Code:
<?php
function machlink($treffer)
{
return 
sprintf('<a href="%s?w=%s">%s<a>'
$_SERVER['SCRIPT_NAME'],
rawurlencode($treffer[1]),
$treffer[1]);
}
?>
 
Alt 06.05.2005, 16:34  
Benutzer
 
Registriert seit: 31.08.2004
Beiträge: 61
RoDa
Standard 2*Recht

Du hast zweimal Recht:
[A-Z...]{1}[a-z...]+..
müsste es wohl heissen, ging aber auch mit
[A-Z...][a-z...]+...

Und rawurlencode hab ich zwar kapiert, aber noch nicht in den Code reingeschreiben, weils bei mir bisher auch ohne funktioniert hat. *schäm*
Ich hols nach, ehrlich versprochen.

Und das if in der Callback-Funktion: Ist das überhaupt möglich?

RoDa
RoDa ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine 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 an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Timestamp problem phrain PHP Tipps 2008 2 04.04.2008 09:41
Problem mit "session.use_trans_sid" (URL korrekt d mAy^daY PHP Tipps 2006 2 13.08.2006 08:44
datensätze defekt oder problem mit dem einlesen? Ministry Datenbanken 4 06.07.2006 18:42
problem!!! PHP Tipps 2006 6 08.02.2006 11:06
[Erledigt] wieder ein Problem bei phpmailer und smtp PHP Tipps 2006 24 07.02.2006 01:07
Apache-2.0.55 & PHP-5.1.1 / Problem beim Kompilieren freq.9 Server, Hosting und Workstations 2 06.01.2006 13:27
[Erledigt] Problem bei Massenmails versenden mit der Funktion mail PHP-Fortgeschrittene 3 19.01.2005 13:36
[Erledigt] Problem mit Übergabe einer Klasse in PHP4 PHP-Fortgeschrittene 10 08.01.2005 21:00
Problem mit Weiterleitung PHP Tipps 2004-2 16 22.12.2004 17:49
Smarty und PHP-Skript Problem PHP Tipps 2004-2 2 03.12.2004 22:27
[Erledigt] Hilfe - Problem mit Warenkorb PHP Tipps 2004 1 26.11.2004 11:32
[Erledigt] PHP Upload (Master Value/Local Value Problem) PHP-Fortgeschrittene 5 23.11.2004 07:21
[Erledigt] Probleme beim PHP5 kompilieren / zlib fehler? Server, Hosting und Workstations 4 03.09.2004 15:39
Problem mit alter JavaScript-Funktion woods PHP Tipps 2004 1 13.08.2004 13:34

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
preg_replace prozentzeichen, wort als link preg_replace php, preg_replace \%\ prozentzeichen, preg_replace $_server[\'php_self\']), preg_replace_callback() wki, php preg_replace backreference, php preg_replace treffer, preg_replace $1 nicht ersetzen, backreference preg_replace kein string, php #^[a-z\\-\\*\\_\\|\\[\\]] $#si

Alle Zeitangaben in WEZ +2. Es ist jetzt 12:35 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.