ugrás a tartalomhoz

Minden szó lecserélése

sEEcher · 2011. Már. 5. (Szo), 14.45
Sziasztok!

Nézelődtem az oldalon, de nem találtam ilyen témát, így nyitnék egyet. Bocsi, ha már meg lett tárgyalva!

A következő problémában szeretném a segítségeteket kérni. Adott egy szöveg, aminek a szavaiból linket kellene csinálni. Tehát a függvénynek végig kellene mennie a szavakon és lecserélni azokat (kivétel nélkül) egy linkre. Pl.:

első szó: elsoszo

csere erre: <a href='search.php?stype=d&stext=elsoszo' target='_blank'>elsoszo</a>

A segítségeteket előre is köszönöm!
 
1

szó

Poetro · 2011. Már. 5. (Szo), 15.12
Már csak az a kérdés, számodra mi számít szónak. Ezt a szabályt kellene kezdetben tisztázni, és utána jöhet a megoldás is.
2

...

sEEcher · 2011. Már. 5. (Szo), 15.16
Bocsi, ez lemaradt. A szöveg tartalma egyszerű magyar szavak szóközzel elválasztva. Bár a jövőben elképzelhetők olyan esetek, amikor egy szóban szám is van. Pl.: kde4
5

preg_replace_callback

Poetro · 2011. Már. 5. (Szo), 15.49
  1. <?php  
  2. header('Content-type: text/html; charset=utf8');  
  3. $data = "Az átverés: fiktív, morgó, önző, punk, fúrtfülű.  
  4. Adjál elém pikírt, bohó költőt, unt, bús tüzűt!  
  5. A fűrészbolt-felvigyázó őrön új kulcsszíj csüng.  
  6. Hálóűrbe fölül lő, bosszús kapusszív vérzik.  
  7. Vízi hosszúbukó-alámerülő működés.  
  8. Új-vitorlázórepülőgép-altípus-röptű  
  9. Fürge rőt róka túlszökik zsíros étkű kutyán.  
  10. Pál fogyó IQ-jú kun exvő, ím dühös a WC-bűzért.  
  11. Bűzös WC-lé (fogyó IQ-jú exvőpár munka) dühít.  
  12. Új, „Exvőd = fél pár” című show közügy Quitóban.  
  13. Jámbor célú, öv ügyű ex-qwan ki dó-s főz, puhít.";  
  14.   
  15. function makeLinks($matches) {  
  16.   return sprintf('<a href="search.php?stype=d&amp;stext=%s">%s</a>', rawurlencode($matches[0]), $matches[0]);  
  17. }  
  18. echo preg_replace_callback('/\pL+[0-9\pL+]*/u''makeLinks'$data);  
3

ékezet

unregistered · 2011. Már. 5. (Szo), 15.28
na meg gondolom az ékezetes betűket is cserélje ékezet nélkülire nem?
4

$ujszoveg =

kuka · 2011. Már. 5. (Szo), 15.29
  1. $ujszoveg = preg_replace('/(\w+)/''<a href="search.php?stype=d&stext=$1" target="_blank">$1</a>'$szoveg);  
  2.   
  3. // vagy  
  4.   
  5. $ujszoveg = preg_replace('/([[:alpha:]])/''<a href="search.php?stype=d&stext=$1" target="_blank">$1</a>'$szoveg);  
  6.   
  7. // vagy  
  8.   
  9. $ujszoveg = preg_replace('/([[:alnum:]])/''<a href="search.php?stype=d&stext=$1" target="_blank">$1</a>'$szoveg);  
Keress rá a \w, [:alpha:] és [:alnum:] jelentésére a reguláris kifejezések dokumentációjában.

Ha van minimális szó hossz követelmény, akkor + helyett használd a {} ismétlőt.

Megjegyzés, hogy a preg_replace() nem működik helyesen multibyte karakteres szövegen.

Még egy megjegyzés, hogy HTML-ben a & jelet entitásként kell írni. Hacsak a szöveged nem lesz további feldolgozásnak alávetve, akkor már a preg_replace()-be ajánlatos entitásként tenni be őket.
6

...

sEEcher · 2011. Már. 5. (Szo), 15.50
Megjegyzés, hogy a preg_replace() nem működik helyesen multibyte karakteres szövegen.


Igen, ezt láttam. :S A "magyar" betűkkel rendelkező szavaknál baj van. Azzal lehet esetleg valamit kezdeni?

Amúgy köszi az eddigi választ.
7

Nem jó

Poetro · 2011. Már. 5. (Szo), 15.56
Mivel az UTF-8 karaktereket nem kezeli jól a \w ezért nem ajánlanám a használatát.
  1. preg_replace('/\w+/u''<a href="search.php?stype=d&stext=$1" target="_blank">$1</a>'$data);  
Kimenete:
 á: , , öő, , ű.
  ,  ő, ,  ű!
 ű- ő ú  .
ű  ő,   .
 -ő ű.
Ú-ő--ű
 ő    éű .
  -  ő, í   -ű.
ű - ( - ő ) .
Ú, „ő =  ” ű   .
 , ö üű -  - ő, .
Hasonló dolog igaz az [:alpha:] és [:alnum:] kifejezésekre. De legalább u módosító esetén nem hibáznak utóbbiak olyan nagyot, épp csak nem találják meg az ő, ű karaktereket.
8

...

sEEcher · 2011. Már. 5. (Szo), 16.33
Ez valahogy nem akar működni, kiürül a $text. Az első megoldás jó, de ott meg a magyar karakterek törik a linket. Valamilyen karakterkódolás konvertálgatós megoldás nincs esetleg? :S
9

Megoldás

Poetro · 2011. Már. 5. (Szo), 16.36
a preg_replace_callback megoldást nézted? Merthogy az működik.
10

...

sEEcher · 2011. Már. 5. (Szo), 16.48
Na azt még csak most vettem észre. A makeLinks függvényt ebben az esetben lehet paraméterezni a preg_replace_callback-ből?
11

Definiáld

Poetro · 2011. Már. 5. (Szo), 16.53
Nem értem a kérdést. A preg_replace_callback pontosan egy paramétert ad át a makeLinks, vagy bármi más callback függvénynek, mégpedig minden egyes találatot jelentő tömböt. Nem tudom mi mást szeretnél csinálni.
12

...

sEEcher · 2011. Már. 5. (Szo), 16.58
Azt, hogy a makeLinks-nek megadható legyen, hogy az URL-ben található stype változóhoz milyen betűt rakjon.
13

Nem szép megoldás

Poetro · 2011. Már. 5. (Szo), 17.45
Ugyan nem szép, de például így meg lehet valósítani:
  1. function makeLinks($matches$type = NULL) {  
  2.   static $stype = 'd';  
  3.   if (isset($type) && is_string($type) && $type !== '') {  
  4.     $stype = rawurlencode($type);  
  5.   }  
  6.   if (is_array($matches)) {  
  7.     return sprintf('<a href="search.php?stype=%s&amp;stext=%s">%s</a>',   
  8.       $stype, rawurlencode($matches[0]), $matches[0]);  
  9.   }  
  10. }  
  11. $wordMatch = '/\pL+[0-9\pL+]*/u';  
  12. echo preg_replace_callback($wordMatch'makeLinks'$data);  
  13. makeLinks('''káró');  
  14. echo preg_replace_callback($wordMatch'makeLinks'$data);  
14

...

sEEcher · 2011. Már. 5. (Szo), 18.02
Köszönöm szépen a segítséget, minden sikerült! :)
15

explode

bonga · 2011. Már. 7. (H), 10.19
A regex-es ékezetes problémák helyett szerintem sokkal egyszerűbb a szóközöknél tömbbé robbantani a stringet és azon végigszaladni:
  1. foreach(explode(' '$szovegas $szo)  
  2.   echo('<a href="search.php?stype=d&stext='.$szo.'" target="_blank">'.$szo.'</a>');  
16

jelek

Poetro · 2011. Már. 7. (H), 10.59
És ezzel hogyan kezeled az olyan írásjeleket, mint ,.;?:!? És még nem is soroltam fel, csak a töredékét. Az ékezetes karakterekre is ott van a megoldásom fentebb, és tökéletesen működik.
17

Na jó, trim() :)

bonga · 2011. Már. 7. (H), 11.41
Rendben, tegyünk bele egy trim() hívást is. Így milyen? Nem egyszerűbb és átláthatóbb? :)
  1. foreach(explode(' '$szovegas $szo)  
  2. {  
  3.   $szoto = trim($szo',.;?:!');  
  4.   echo('<a href="search.php?stype=d&stext='.$szoto.'" target="_blank">'.$szoto.'</a>');  
  5. }  
18

Nem jó

Poetro · 2011. Már. 7. (H), 12.15
Ez természetesen még mindig nem jó. Elvégre nem tudhatod, hogy biztosan szóköz lesz-e az elválasztó karakter. Tegyük fel, hogy minden sorban csak egy szó van, akkor nincs benne szóköz. A szavakat mondjuk pont, vessző, kötőjel, gondolatjel, vagy ezek tetszőleges kombinációja választja el. Ezeket az ilyen egyszerű explode nem tudja kezelni. Tehát a következőt a te megoldásod egyetlen szónak tekinti:
szó1
szó2:szó3
szó4-szó5
szó6?
szó7,szó8;szó9
19

Nem egyszerűbb és

kuka · 2011. Már. 7. (H), 12.58
Nem egyszerűbb és átláthatóbb? :)
A végeredmény nem is számít? Mert a te kódod a szövegből szóhalmazt csinál. Miután eltünteti az írásjeleket az eredmény olyan olvashatatlan ömleny lesz mint bizonyos tagtársaink hozzászólásai.