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
<?php
header('Content-type: text/html; charset=utf8');
$data = "Az átverés: fiktív, morgó, önző, punk, fúrtfülű.
Adjál elém pikírt, bohó költőt, unt, bús tüzűt!
A fűrészbolt-felvigyázó őrön új kulcsszíj csüng.
Hálóűrbe fölül lő, bosszús kapusszív vérzik.
Vízi hosszúbukó-alámerülő működés.
Új-vitorlázórepülőgép-altípus-röptű
Fürge rőt róka túlszökik zsíros étkű kutyán.
Pál fogyó IQ-jú kun exvő, ím dühös a WC-bűzért.
Bűzös WC-lé (fogyó IQ-jú exvőpár munka) dühít.
Új, „Exvőd = fél pár” című show közügy Quitóban.
Jámbor célú, öv ügyű ex-qwan ki dó-s főz, puhít.";

function makeLinks($matches) {
  return sprintf('<a href="search.php?stype=d&amp;stext=%s">%s</a>', rawurlencode($matches[0]), $matches[0]);
}
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

$ujszoveg = preg_replace('/(\w+)/', '<a href="search.php?stype=d&stext=$1" target="_blank">$1</a>', $szoveg);

// vagy

$ujszoveg = preg_replace('/([[:alpha:]])/', '<a href="search.php?stype=d&stext=$1" target="_blank">$1</a>', $szoveg);

// vagy

$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.
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:
function makeLinks($matches, $type = NULL) {
  static $stype = 'd';
  if (isset($type) && is_string($type) && $type !== '') {
    $stype = rawurlencode($type);
  }
  if (is_array($matches)) {
    return sprintf('<a href="search.php?stype=%s&amp;stext=%s">%s</a>', 
      $stype, rawurlencode($matches[0]), $matches[0]);
  }
}
$wordMatch = '/\pL+[0-9\pL+]*/u';
echo preg_replace_callback($wordMatch, 'makeLinks', $data);
makeLinks('', 'káró');
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:

foreach(explode(' ', $szoveg) as $szo)
  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? :)

foreach(explode(' ', $szoveg) as $szo)
{
  $szoto = trim($szo, ',.;?:!');
  echo('<a href="search.php?stype=d&stext='.$szoto.'" target="_blank">'.$szoto.'</a>');
}
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.