Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Replace Count Parameter?!

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Gachet01
    hat ein Thema erstellt [Erledigt] Replace Count Parameter?!.

    [Erledigt] Replace Count Parameter?!

    Hallo zusammen,

    ich habe ein forum. Das Forum hat ein lexikon angegliedert. Wörter welche im lexikon vorkommen, werden im Forum durch einen Link zum lexikon ersetzt. Wenn aber in einem Text 10 mal ein Wort vorkommt, wird es auch 10mal durch einen Link ersetzt...ich hätte es aber gerne so, dass jedes Wort nur einmal ersetzt wird. Dazu müsste man doch den Count / Limit Parameter heranziehen können? hab php5!

    Ich habe diesen schon an alle stellen im folgenden Code platziert...trotzdem wird aber immernoch jedes Wort mehrmals verlinkt. Danke für Hilfe...wo würdet Ihr den Limit / Count parameter hinzufügen?

    PHP-Code:
    if (count($crosslink_word)) {
            
    $message str_replace('\"''"'substr(preg_replace('#(\µ(((?>([^µ§]+|(?R)))*)\§))#se'"preg_replace(\$crosslink_word, \$crosslink_url, '\\0')"'µ' $message '§'), 1, -1));
        } 

  • Gachet01
    antwortet
    danke Asipak, hat nun funktioniert. perfekt...vielen dank für deine Mühen. Heute scheint die Sonne

    Einen Kommentar schreiben:


  • marc77
    antwortet
    hatte ein ähnliches problem. jetzt gehts!

    Einen Kommentar schreiben:


  • Asipak
    antwortet
    Achso, so machen dann auch die beiden Ausdrücke (etwas) Sinn.

    Habe mal etwas mit Assertions gebastelt:

    Code:
    #\b(?<!\=(\"|\'))('.{cache_row.ID}.')\b#i
    Wenn vor dem Begriff =" oder =' steht, wird nichts ersetzt. Vielleicht reicht das ja.

    Einen Kommentar schreiben:


  • Gachet01
    antwortet
    Hallo,

    also dieser code ist wohl dazu da, dass innerhalb von alt="" oder title="" kein wort ersetzt wird, sonst wäre es ja ein link in einem link.

    wenn ich nur

    $crosslink_word[] = '#\b('.{cache_row.ID}.')\b#i';

    Schreibe, dann wird das Wort innerhalb von alt="" ersetzt.

    Schreibe ich hingegen:

    $crosslink_word[] = '#\s('.{cache_row.ID}.')\b#i';

    dann passt eigentlich alles, nur dass ein Wort welches am zeileanfang steht, nicht ersetzt wird. Damit könnte ich aber notgedrungen leben...

    Was denkst du?

    Einen Kommentar schreiben:


  • Asipak
    antwortet
    Tut mir Leid, aber mir ist die Arbeisweise deines Ausdrucks nicht ganz klar.

    Es schaut so aus, als würden dort absichtlich Trennzeichen (das My und das Paragraphenzeichen) an den Anfang und das Ende des Strings gehangen werden, damit der verwendete Ausdruck den gesamten String in eine preg_replace Funktion schieben kann, die dann wiederum durch den gesetzen e-Modifier in der "äußeren" preg_replace - Funktion ausgeführt wird. Die preg_replace - Funktion, die als Callbackfunktion aufgerufen wird, ersetzt dann erst die in deinen Arrays angegebenen Wörter, wenn ich das richtig verstehe.

    Nur verstehe ich den Sinn davon nicht Bevor ich helfen kann, muss mich wohl noch jemand aufklären

    Eventuell klappt es so:

    PHP-Code:
    $message str_replace('\"''"'preg_replace($crosslink_word$crosslink_url$message)); 
    Warum es aber nicht mit:
    Code:
    $crosslink_word[] = '#\b('.{cache_row.ID}.')\b#i';
    klappen soll, sehe ich nicht.

    Gruß

    [edit]

    Achso, in deinem letzten Codebeispiel hast du noch einen Slash nach dem Rautenzeichen zu viel, denke ich.

    Einen Kommentar schreiben:


  • Gachet01
    antwortet
    Hallo,

    mache ich gerne. Auf der ersten Seite hast du erwähnt:

    Naja, wenn du den "gleichen" Ausdruck mehrmals in dein Array schreibst, wird er auch mehrmals das Wort ersetzen, nach dem du suchst. Wenn du beide Zeichenklassen (\b und \s) vor und hinter dem Ausdruck verwendest, stellst du sicher, dass vor und hinter dem Wort ein Leerzeichen (bei \b kann das auch z.B: ein Komma sein) stehen muss. Siehe auch: Quakenet/#php Tutorial - de - Reguläre Ausdrücke . Die Verwendung macht so also wenig Sinn, denke ich.

    Mein array sieht im moment so aus:

    PHP-Code:
    $crosslink_word[] = '#\b('.{cache_row.ID}.')\s#i';
    $crosslink_url[] = '<a href="lexicon.'.$phpEx.'?letter='.{cache_row.ID}.'" class="crosslink" title="'.{cache_row.ID}.' Erkl&auml;rung">'.{cache_row.ID}.'</a> ';
    $crosslink_word[] = '#\s('.{cache_row.ID}.')\b#i';
    $crosslink_url[] = ' <a href="lexicon.'.$phpEx.'?letter='.{cache_row.ID}.'" class="crosslink" title="'.{cache_row.ID}.' Erkl&auml;rung">'.{cache_row.ID}.
    Es sind also 2 ersetzungsmöglichkeiten. d.h. das wort wird immer 2 mal ersetzt.

    Du hast mir dann diesen code gegeben:

    PHP-Code:
    $search = array('/\b(foo)\b/i''/\b(bla)\b/i',); 
    Dieser deckt wohl alle möglichkeiten ab, passt aber nicht zu meiner regexp:

    PHP-Code:
    $message str_replace('\"''"'substr(preg_replace('#(\µ(((?>([^µ§]+|(?R)))*)\§))#se'"preg_replace(\$crosslink_word, \$crosslink_url, '\\0')"'µ' $message '§'), 1, -1)); 
    Die Frage ist also, kann ich aus meinen 2 Arrays eine machen unter Beibehaltung der Funktionen. Schreibe ich z.b.:

    PHP-Code:
    $crosslink_word[] = '#/\b('.'Logitech'.')\b#i'
    geht das nciht, weil es wohl nicht zu meiner regexp passt...ich möchte also aus meinen 2 arrays eins machen, falls das überhaupt geht...falls nciht, werde ich mich für eins der beiden entscheiden. hoffe es ist verständlich?

    Einen Kommentar schreiben:


  • Asipak
    antwortet
    Ich verstehe leider nicht, was du meinst. Kannst du das mit Beispielcode erklären?

    Einen Kommentar schreiben:


  • Gachet01
    antwortet
    Hallo,

    danke super, jetzt klappt das auch

    letzte frage, ich habe ja jetzt 2 arrays. also würde auch 2 mal ersetzt. für welche der beiden würdest du dich entscheiden oder gibts auch eins das beide beinhaltet..so wie deins am anfang:

    array('/\b(foo)\b/i', '/\b(bla)\b/i',);

    Ich habe es mit deinem schon probiert und dort # und i eingefügt aber es will net so richtig..du meintest ja, 2 wären unnötig. Danke

    Einen Kommentar schreiben:


  • Asipak
    antwortet
    Du verwendest die Raute als Delimiter, nicht den Slash.

    Code:
    #\b('.{cache_row.ID}.')\s#i

    Einen Kommentar schreiben:


  • Gachet01
    antwortet
    Hallo,

    danke das du nochmal antwortest. Das habe ich bereits gemacht, so wie ich es bei dir gesehen hatte. wenn ich aber:

    PHP-Code:
    $crosslink_word[] = '#\b('.{cache_row.ID}.')\s#/i';
    $crosslink_url[] = '<a href="lexicon.'.$phpEx.'?letter='.{cache_row.ID}.'" class="crosslink" title="'.{cache_row.ID}.' Erkl&auml;rung">'.{cache_row.ID}.'</a> ';
    $crosslink_word[] = '#\s('.{cache_row.ID}.')\b#/i';
    $crosslink_url[] = ' <a href="lexicon.'.$phpEx.'?letter='.{cache_row.ID}.'" class="crosslink" title="'.{cache_row.ID}.' Erkl&auml;rung">'.{cache_row.ID}.'</a>'
    oder das /i nur in einer zeile hinter die raute setze kommt bei allen konstellationen immer:

    Warning: preg_replace() [function.preg-replace]: Unknown modifier '/' in /

    danke für hilfe..weiss es zu schätzen...

    Einen Kommentar schreiben:


  • Asipak
    antwortet
    Ein Modifier gehört immer hinter den abschließenden Delimiter, in deinem Fall also hinter das Rautenzeichen.

    Einen Kommentar schreiben:


  • Gachet01
    antwortet
    der erste code welchen ich gepostet hatte

    PHP-Code:
    if (count($crosslink_word)) { 
            
    $message str_replace('\"''"'substr(preg_replace('#(\µ(((?>([^µ§]+|(?R)))*)\§))#se'"preg_replace(\$crosslink_word, \$crosslink_url, '\\0')"'µ' $message '§'), 1, -1)); 
        } 
    das dazu passende array war:

    PHP-Code:
    $crosslink_word[] = '#\b('.{cache_row.ID}.')\s#';
    $crosslink_url[] = '<a href="lexicon.'.$phpEx.'?letter='.{cache_row.ID}.'" class="crosslink" title="'.{cache_row.ID}.' Erkl&auml;rung">'.{cache_row.ID}.'</a> ';
    $crosslink_word[] = '#\s('.{cache_row.ID}.')\b#';
    $crosslink_url[] = ' <a href="lexicon.'.$phpEx.'?letter='.{cache_row.ID}.'" class="crosslink" title="'.{cache_row.ID}.' Erkl&auml;rung">'.{cache_row.ID}.'</a>'
    der macht eigentlich genau das, dass innerhalb von alt und title tags etc nix ersetzt wird. Nur weiss ich nicht, wo ich dort das /i unterbringen soll um groß kleinschreibung zu ignorieren...

    Einen Kommentar schreiben:


  • Gachet01
    antwortet
    wäre schön wenn mir jemand hilft, danke!

    Einen Kommentar schreiben:


  • Gachet01
    antwortet
    So, jetzt ist mir noch was aufgefallen, hoffe mir kann jemand helfen. Das array sieht jetzt so aus:

    $search = array('/\b(foo)\b/i', '/\b(bla)\b/i',);

    wenn jetzt aber im Text irgendwo ein Bild ist und das Bild hat ein alt tag und in diesem alt tag steht z.b. alt="foo" dann wird dies auch ersetzt und dadurch entsteht natürlich ein html fehler weil:

    <a href=""><img src="" alt="<a href="">foo</a>"></a> .....

    Wie muss ich denn die regex so ändern, dass er "foo" im alt tag oder title tag nicht beachtet?

    Einen Kommentar schreiben:

Lädt...
X