Wort in einem String automatisch verlinken

Hallo,

ich möchte das ein Wort (parameter) automatisch verlinkt wird.

Beispiel: Der Parameter $dec_point bestimmt das Trennzeichen für die Nachkommastellen.

jetzt sollte dec_point verlinkt werden, Start wäre nach $ und ende ’ Leerzeichen’ bzw. ) klammer zu bzw. eventuell noch andere Zeichen, aber keine Buchstaben.

Ich denke gerade an eine Funktion wie diese die zb urls automatisch verlinkt nur nicht so komplex. (Hab da kein Durchblick, deshalb die Frage)

Alex

Hi, ich habe eine Idee aber weiß nicht ob ich das nun richtig verstanden hatte.

Aber ich denke das sollte so funktionieren

[PHP]
$pattern = ‚/($)(\w+)/‘;
$replace = ‚$1$2‘;
$string = ’ Der Parameter $dec_point bestimmt das Trennzeichen für die Nachkommastellen.';

$result = preg_replace($pattern, $replace, $string);

[/PHP]

Ergebnis sollte dann sein

Der Parameter $dec_point bestimmt das Trennzeichen für die Nachkommastellen.

Bin leider aber noch nicht so gut was reguläre Ausdrücke angeht, also kann es sein das ich etwas nicht bedacht habe.

EDIT: Es sollte ja nach dem $ Zeichen anfangen.

Hi B3nnoX,

vielen Dank, funktioniert jetzt bestens => :wink:

ALex

So wie es für mich aussieht willst du einfach nur PHP Parsen und entsprechend deiner wünsche verlinken. Dieses kannst du wunderbar mit folgender Funktion erledigen. http://de2.php.net/token_get_all

Du bekommst praktisch deinen ganzen Code in seine Grundstruktur aufgebrochen und kannst für jeden eine entsprechende Aktion in deinem Parser hinterlegen. Dieses ist auch gleich viel sicherer als Reguläre ausdrücke zu benutzen. Ganz einfach an der Tatsache demonstriert, dass du mit regulären Ausdrücken keine Strings auseinandernehmen kannst. (Man kann es schon. Ich habe viel Zeit darin verschwendet es zu tun und es gibt viel leichtere methoden. ;P)

Den folgenden String kann deine Anwendung z.b. nicht von einer Echten Variable unterscheiden:

[php]$var = ‚text $var2 text‘;[/php]

Also wenn du das nicht nur einfach dreckig und schnell erledigen willst sondern etwas bauen willst das wirklich funktioniert, arbeite mit den Tokens die PHP dir so freundlich ausliefert.

Falls du auch andere Sprachen auseinandernehmen willst solltest du dir mal Lexikalische Parser oder Token Parser angucken. (Google)

Lg

Hallo Slibbo, ich klinke mich einfach nochmal ein weil das Forum mir ja auch hilft mich immer weiter zu entwickeln. Aber dein Einwand versteh ich nun nicht.

Denn webana möchte die PHP Variable in seinem Beispiel Satz ja nicht geparst haben, ich vermute (soweit ich seine anderen Threads verfolgt habe) das er eine Dokumentation baut oder ähnliches.

Also ich kenne nur zwei Möglichkeiten das umzusetzen was er will, einmal mit str_replace, dann muss man aber auch die Textpassage angeben welche ersetzt werden soll, im Beispiel Satz nun ‚$dec_point‘ oder halt über den regulären Ausdruck der automatisch alle Variablen im Satz verlinkt. Jedoch verlinkt er wirklich alle Variablen im text

Und folgendes versteh ich nicht so ganz. Wenn $var2 nun eine echte Variable ist die geparst werden soll, dann sind die einfachen Hochkommata eh falsch.

Es geht ja gerade darum das es einfache anführungszeichen sind in meinem Vorschlag. Was er genau machen will weiß ich auch nicht aber wenn er PHP Dateien auseinandernehmen will sollte er lieber auf PHP eigene Mittel zufückgreifen anstadt auf Reguläre Ausdrücke.

Es wäre wohl sinnvoll, wenn du uns genau sagst was du überhaupt vorhast @webana.

Ich möchte die parameter im aufbau der function verlinken

string substr ( string $string , int $start [, int $length ] ) 

Da ich das ganze auch noch farblich Formatiert haben möchte, gibts da noch eine zweite Baustelle http://www.html.de/threads/preg_replace-woerter-wie-im-array-angegeben.52393/#post-358668 Ich glaub es wäre besser dies zusammen zulegen …

Ich habe die Geschichte mit dem Parameter verlinken nur schon abgehakt, da dies ja schon funktioniert.

Alex

Das sieht an sich total einfach aus.

/$([^\s]+)/ ← zum ersetzen von variablen (auch wenn du das $ nicht mit haben willst ich würde es trotzdem mit markieren. Also das man am ende soetwas hat $variable)

für die ganzen type wie int und so weiter benutzt du str_replace und ein array in das du all die möglichen typen wie int, string, callback und so weiter schreibst.

Und für die funktionsnamen nimmst du auch entweder ein solches array in das du alle funktionen rein schreibst, oder du nimmst so einen regulären ausdruck

/[1]+([^\s]+)/ ← für die funktionsnamen

======

schwierig wirds nur, wenn du die texte nicht alle von einander getrennt hast und vor und nach dieser zeile noch text kommt. in dem fall solltest du dir eine möglichkeit suchen, wie du den text extra behandeln kannst wie z.b. hier im forum mit den [ php ] tags und so weiter.


  1. ^\s ↩︎

für die ganzen type wie int und so weiter benutzt du str_replace und ein array in das du all die möglichen typen wie int, string, callback und so weiter schreibst.

Habs jetzt mal so gemacht, deckt auch das meinste ab. Jetzt hab ich halt so kleinkram wie = 75, = ‚,‘ , und so weiter … wie zb bei number_format

string number_format ( float $number , int $decimals = 0 , string $dec_point = '.' , string $thousands_sep = ',' )

Mein Code:

[PHP]########################################################################################################################################
$array_type = array(‚array‘,‚bool‘,‚float‘,‚int‘,‚string‘);
foreach ($array_type as $type) {
$text = preg_replace(„/(([^$]|\A)\b$type\b)/i“, ’ ‚.$type.‘ ‚, $text);
}
########################################################################################################################################
$array_initializer = array(‘= false’, ‚= true‘);
foreach ($array_initializer as $initializer) {
$text = str_replace($initializer, ’ ‚.$initializer.‘ ‚, $text);
}
########################################################################################################################################
$text = preg_replace(„/(([^$]|\A)\b$fname\b)/i“, ’ ‘.$fname.' ', $text);[/PHP]

Es wird immer nur der Aufbau der function siehe oben zum Formatieren gegeben, sonst kein Text …

Alex

Ein Bug habe ich noch, gerade bei array, dies gib es ja als type und als function …

Vielleicht eine Überprüfung rein machen, ala Wort befindet sich in einem span tag, nichts machen da schon formatiert …

Mein Provisorischer Code:

[PHP] $array_type = array(‚array‘,‚bool‘,‚float‘,‚int‘,‚resource‘,‚string‘,‚void‘);
foreach ($array_type as $type) {
$text = preg_replace(„/(\b$type\b)/i“, ’ ‚.$type.‘ ', $text);
}

$array_initializer = array(‚= false‘,‚= true‘,‚= SORT_STRING‘,‚= 0‘,‚= '.'‘,‚= ','‘,‚= -1‘,‚= ENT_COMPAT | ENT_HTML401‘,‚= „UTF-8“‘,‚= „\n“‘,‚= 75‘);
foreach ($array_initializer as $initializer) {
$text = str_ireplace($initializer, ’ ‚.$initializer.‘ ', $text);
}

$text = preg_replace(„/(([^$]|\A)\b$name\b)/i“, ’ ‚.$name.‘ ', $text);

$text = str_replace(‚<span class=„type“ array <span class=„type“ array ‘, ’ array array', $text);

return parameter_verlinken($text);[/PHP]

Gruß Alex

Du brauchst einen lexikalischen parser! Da führt kein weg drum rum, wenn du es anständig machen willst.

Mit einem lexikalischen parser kannst du ganz einfach regeln aufstellen wie z.b.

Funktions Header Definition
Eine Funktion hat einen rückgabewert: string | int | float | double | mixed | callback
Danach kommt immer ein Funktionsname: [a-z_][a-z0-9_]*

Variablen Definition
Eine Variable hat einen Typen: string | int | float | double | mixed | callback
Danach kommt der Name der Variable: $[a-z_][a-z0-9_]*

Funktions Definition
Eine Funktion besteht aus folgenden Komponenten: Funktions Header Definition ( [Variablen Definition [ , … ] )

Dem parser werden nun diese Definitionen übergeben, und schon bekommst du alles genauen Teilen aufgeteilt zurück.
Und wenn die PHP Spezifikationen erweitert werden musst du nur diese paar Regeln anpassen und nichts anderes mehr. Deinen Code musst du also kein Zweites mal anfassen. Das sollte immer ein Ziel beim Programmieren sein.