Seite 1 von 1
preg_replace limit will nicht
Verfasst: 03.04.2010, 20:00
von marc77
Hallo,
ich möchte das jedes Wort das er findet nur einmal mit einem link ersetzt wird und nicht jedes mal.
Den Limit Parameter hab ich gesetzt aber er hält sich einfach nicht dran. evtl. liegt es am if (count($crosslink_word)) ??? Weil $crosslink_word ist ein array:
$crosslink_word = array();
hier der code:
Code: Alles auswählen
if (count($crosslink_word)) {
$message=preg_replace($crosslink_word, $crosslink_url, $message, 1);
}
danke!
Re: preg_replace limit will nicht
Verfasst: 04.04.2010, 13:39
von Hasenhuf
marc77 hat geschrieben:ich möchte das jedes Wort das er findet nur einmal mit einem link ersetzt wird und nicht jedes mal.
Das heißt was genau?
marc77 hat geschrieben:Den Limit Parameter hab ich gesetzt aber er hält sich einfach nicht dran.
Das heißt was genau?
Laß mich raten, die Worte z.B. Hausbot und Haus sollen verlinkt werden und nachdem er Hausbot verlinkt hat, wird in dem Link Haus nochmal verlinkt?
marc77 hat geschrieben:evtl. liegt es am if (count($crosslink_word)) ??? Weil $crosslink_word ist ein array:
if (irgendwas) ist wahr oder falsch und was in dessen Abhänigkeit ein mal ausgeführt wird ist davon unabhängig.
Verfasst: 05.04.2010, 12:34
von w3news
Verfasst: 05.04.2010, 16:25
von marc77
Hi,
danke, das hatte ich bereits gelesen. ich hab mein problem nun auch fast gelöst. Es lag in der Tat am IF, da das preg match ungeachtet vom limit natürlich so oft ausgeführt wurde, wie das If ein Wort gefunden hat.
Mein code sieht jetzt so aus:
$string = bla bla bla foo foo bla bla
$search[] = '/\b('.'foo'.')\b/i';
echo preg_replace($search, $replace, $string, 1);
Es funktioniert alles nur habe ich das Problem wenn 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?
'/\b('.'foo'.')\b/i'; ???
Danke
Verfasst: 05.04.2010, 16:30
von w3news
Wurde auch in dem Thread beantwortet den ich gepostet hatte.

Platzhalter für den img- Tag und danach dann wieder einfügen.
Verfasst: 05.04.2010, 19:00
von marc77
Hi,
danke
im letzten Satz deines Topics steht ja:
Am besten ist denke ich alle Leerzeichen zwischen <img und dem ersten > gegen einen Platzhalter (z.B. @@) zu tauschen, dann Autolinks setzen und zuletzt die Platzhalter wieder gegen Leerzeichen ersetzen.
Wie sieht sowas praktisch aus. Magst mir mal deinen fertigen code zeigen? danke
Verfasst: 05.04.2010, 19:11
von w3news
Ich hab es selber (noch) nicht eingebaut, aber ich würde es ungefähr so machen:
Vor dem Ersten preg_replace einfach den Orginaltext mit str_replace die Leerzeichen durch @ ersetzen:
Und nach dem preg_replace halt wieder umwandeln:
Verfasst: 06.04.2010, 09:46
von marc77
sorry aber irgendwie verstehe ich das immernoch nicht..was hat das für einen sinn?
angenommen es wird das wort "test" ersetzt und im string gibt es
<a href="tld.de" title="super, dass ist ein Test und...">Test</a>
oder
<img src="1.jpg" alt="super, dass ist ein Test und...">
dann würde doch das Test innerhalb von alt und title trotzdem ersetzt oder?
Verfasst: 06.04.2010, 09:54
von Synonym
dann würde doch das Test innerhalb von alt und title trotzdem ersetzt oder?
JA
Soll die Linkbezeichnung "Test" in dem Fall eigentlich ersetzt werden oder nicht? Eher nicht, oder? Wäre dann ja ein Link in einem Link
Verfasst: 06.04.2010, 10:07
von marc77
Richtig, innerhalb von alt und title Tags soll natürlich nix ersetzt werden, da ja dann ein link in einem link und dann gibts nen fehler oder das Bild wird nicht dargestellt.
Man kann das wohl mit regexp lösen, ich habe einen code gefunden:
Code: Alles auswählen
$message = str_replace('\"', '"', substr(preg_replace('#(\µ(((?>([^µ§]+|(?R)))*)\§))#se', "preg_replace(\$crosslink_word, \$crosslink_url, '\\0', 1)", 'µ' . $message . '§'), 1, -1));
das array sieht so aus:
Code: Alles auswählen
$crosslink_word[] = '#\b('.{cache_row.ID}.')\s#';
$crosslink_url[] = '<a href="lexicon.'.$phpEx.'?letter='.{cache_row.ID}.'" class="crosslink" title="'.{cache_row.ID}.' Erklä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ärung">'.{cache_row.ID}.'</a>';
das wäre auch alles perfekt, wenn ich aber jetzt noch die groß kleinschreibung ersetzung mit /i einfügen will, wird nix ersetzt. Ich habe also versucht im array hinter \b# ein /i einzufügen, das geht aber nicht..wo muss ich denn das /i einfügen?