RegExp - preg_replace, zastępowanie drugiego wystąpienia słowa

0

Witam, robię coś takiego jak linkowanie wewnętrzne w PHP i potrzebuje zamieniać frazy na linki do innych podstron serwisu. Interesuje mnie coś takiego, jest artykuł na 100 słów, pierwsze wystąpienie frazy np. wiosna jest drugim słowem w tekście, więc trochę za wcześnie na link, dlatego chciałbym żeby funkcją preg_replace() zastępować dopiero drugie wystąpienie tego słowa, czyli w moim przypadku jest to 48 słowo dla przykładu i to ono ma być zastąpione linkiem. Wie ktoś, jak ułożyć wyrażenie regularne do podmieniania takich fraz?

0

Może lepiej zastosować BB code z własnym tagiem, tudzież inny podobny system?
[link]wiosna[/link]

Napisałeś dosłownie dwa zdania opisujące, jakie ma być działanie skryptu. Trochę mało, szczególnie, że właściwie nie wiadomo, jakie są kryteria decydowanie czy daną frazę można już zamienić na link, czy jeszcze nie.
Masz może jakąś ogólną bazę wyrażeń, które mają być zamieniane na linki? Skąd skrypt ma wiedzieć, czy zamienić daną frazę?

Moim zdaniem, stosowanie preg_replace nie jest potrzebne a nawet może utrudnić pracę. A co z takim rozwiązaniem.

  1. Z długości całego tekstu wyznaczasz sobie offset, w którym nie zamieniasz frazy na link.
  2. W pętli, aż do przeszukania całego tekstu szukasz pozycji pierwszego wystąpienia danej frazy (z offsetem).
  3. Jeśli coś znalazłeś to dane wystąpienie zamieniasz na link (masz pozycję i długość szykanej frazy) i zwiększasz offset do następnego wyszukiwanie o długość linku, który wstawiłeś.
  4. Jeśli nie znalazłeś - fraza nie występuje w tekscie...

Takie trochę toporne ale może będzie działać.
O to, że offset wyjdzie poza długość tekstu nie trzeba się chyba martiwć?

0

prosta sprawa.

przykładowowo
$content = treść artykułu,
$reg = "/wiosna/";

robisz preg_match_all($reg,$content,$matches,PREG_OFFSET_CAPTURE);

użyta flaga PREG_OFFSET_CAPTURE zwraca ci pozycję wystąpienia wyrażenia, czyli np 50znak ciągu.

potem odwołujesz się $matches[0][1][1] <- tu masz pozycje w tekście drugiego wystąpienia, analogicznie 5 wystąpienie to $matches[0][4][1]

$matches[0][1][0] => znaleziona fraza (2 wystąpienie)
$matches[0][1][1] => pozycja początku frazy (2 wystąpienie)

następnie wycinasz ten fragment z tresci i wstawiasz inny.

1 użytkowników online, w tym zalogowanych: 0, gości: 1