ugrás a tartalomhoz

Preg_replace

rob66 · 2012. Nov. 28. (Sze), 12.00
Sziasztok!

Azt szeretném megtudni, hogy az alábbi preg_replace fg.-t, mely jelen formájában a nem alfanumerikus karakterek törlését végzi a karakterláncból, hogy lehetne úgy módosítani, hogy a . - / ? , karaktereket ne törölje?
	
$str1 = preg_replace('/[^a-z0-9áéíóöőúüűÁÉÍÓÖŐÚÜŰ ]{1,}/i', '', $str1);
Előre is köszönöm a válaszokat!
 
1

preg_replace('/[^\pL\d\.\-\?]

Poetro · 2012. Nov. 28. (Sze), 12.12
preg_replace('/[^\pL\d\.\-\?]+/ui', '', $str1);
nem próbáltam ki
2

\pL

hNczy · 2012. Nov. 28. (Sze), 14.01
Hmmm. Ma is tanultam valamit. Köszi!

Unicode Regular Expressions
\pL - any kind of letter from any language
3

Majdnem tökéletes, de a /

rob66 · 2012. Nov. 29. (Cs), 09.49
Majdnem tökéletes, de a / jelet is törli.

Itt a jó megoldás:

$str = preg_replace('/[^a-zA-Z0-9\.\-\/\?\!\,\_áéíóöőúüűÁÉÍÓÖŐÚÜŰ]{1,}/i', '', $str);

4

nehezebb lett volna Poetro

szabo.b.gabor · 2012. Nov. 29. (Cs), 12.38
nehezebb lett volna Poetro verzióját kiterjeszteni..
preg_replace('/[^\pL\d\.\-\?\/]+/ui', '', $str1);  
5

Ha egy stringből el akarom

sandrosdj · 2012. Dec. 12. (Sze), 21.52
Ha egy stringből el akarom távolítani a html kommenteket (<!-- fdfa --> KIVÉVE ha a komment tartalmaz [ és ] valamint / jeleket, milyen regexp lenne alkalmas?

A következőt mivel bővítsem ki?
'/<!--(.*)-->/Uis'
6

Semmilyen

Poetro · 2012. Dec. 12. (Sze), 22.08
Egy ilyen reguláris kifejezést elég bonyolult megírni, és legjobb, ha nem is teszed, mivel reguláris kifejezéssel szinte lehetetlen. Mire szeretnéd használni? Miért nem használsz HTML / XML feldolgozót? Az el tudja belőle távolítani.
7

Az oldalon vannak olyan

sandrosdj · 2012. Dec. 12. (Sze), 22.19
Az oldalon vannak olyan részek is, ahol a böngésző típusát vizsgálom meg, de a jelenlegi kód azokat is kiszedi.
Pl.:
<!--[if lt IE 9]><script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
Azok a feldolgozók mennyire megbízhatóak ill. mennyire terhelik meg a szervert?

Ui: arra gondoltam, hogy első körben átírom a komment tag-eket <!-- --> (amelyekben van [ és ]) valami másra, második körben kiszedem a maradék kommenteket (amelyekben nincsenek olyan karakterek), majd egy újabb körben visszaíratom a kicserélt dolgokat.. Ez viszont lassú lenne.
8

PHP

Poetro · 2012. Dec. 12. (Sze), 22.35
A PHP-ba beépítve ottvan a DOM. Ezen kívül érdemesebb sima string műveleteket használni, ilyen feladatra, mert a könnyebb bánni vele, főleg ha a kommentekben sortörés, vagy beleágyazva másik komment van. Ezen kívül a fentit kibővítheted egy kicsit több logikával, ha a preg_replace helyett preg_replace_callback-et használsz, és ott csinálsz további ellenőrzéseket a találatra.
Az, hogy mennyire terheli a szervert, csak a felhasználáson múlik. A reguláris kifejezések is kifektethetnek egy szervert, ha nem megfelelően használják őket.
9

Üdv ismét!Mi annak a

sandrosdj · 2012. Dec. 30. (V), 16.59
Üdv ismét!

Mi annak a megoldásnak a neve (ha van neki), amit fórumokon (pl. ubuntu fórumon) lehet látni, hogy html kódokkal lehet szerkeszteni a tartalmat, de le vannak korlátozva, tehát csak bizonyos tag-eket lehet használni és milyen regex kell ehhez (ha regex kell)?

Jelenleg átalakítom a megfelelő kódokat így:
<a href="asdasd">asd</a> = {[a href={!}asdasd{!}]}asd{[/a]}
aztán jön a htmlspecialchars() és visszaalakítom str_replace-el.

Hiszem, hogy van ésszerűbb megoldás is, ezért írtam.
10

strip_tags

Greg · 2012. Dec. 30. (V), 18.16
http://php.net/manual/en/function.strip-tags.php

At tudod adni parameterkent az engedelyezett tag-eket.
11

Köszönöm a választ :)

sandrosdj · 2012. Dec. 30. (V), 18.47
Köszönöm a választ :)
12

XSS

Poetro · 2012. Dec. 30. (V), 18.57
De fontos hozzátenni, hogy ez nem véd a XSS-től, azokra fel kell készíteni a szkriptedet, ha HTML bevitelét engedélyezed.
13

Még van egy pár dolog, ami

sandrosdj · 2013. Feb. 6. (Sze), 15.09
Még van egy pár dolog, ami eddig kimaradt a reguláris kifejezéses tudományaim közül, ilyen a következő is.

[a-zA-Z0-9] karaktereket engedélyezek, plusz ezekhez kellenek még az "(idézőjel), '(aposztróf) :(kettőspont), ;(pontosvessző), -(kötőjel), =(egyenlő), _(alsó vonal) és maga a vessző is, viszont nem jött össze, hogy működjenek is.

Amit eddig alkottam:
([a-zA-Z=:"\'-_,;]+)
Mit kellene máshogy csinálnom?
14

Szerintem ott csak annyi gond

kuka · 2013. Feb. 6. (Sze), 15.26
Szerintem ott csak annyi gond van, hogy karakter osztály megadásánál a kötőjelnek különleges jelentése van. Tehát vagy árnyékold egy fordított törtvonallal, vagy utolsónak említsd a karakterek felsorolásánál:
Interactive shell

php > $str=<<<VEGE
<<< > [a-zA-Z0-9] karaktereket engedelyezek, plusz ezekhez kellenek meg az "(idezojel), '(aposztrof) :(kettospont), ;(pontosvesszo), -(kotojel), =(egyenlo), _(also vonal) es maga a vesszo is, viszont nem jott ossze, hogy mukodjenek is.
<<< > VEGE;

php > echo preg_replace('/[a-zA-Z0-9=:"\'\-_,;]+/','',$str);
[]        () () () () () () ( )            .

php > echo preg_replace('/[a-zA-Z0-9=:"\'_,;-]+/','',$str);
[]        () () () () () () ( )            .
15

Működik

sandrosdj · 2013. Feb. 6. (Sze), 18.48
Köszönöm szépen! Működik.

Így sikerült működésre bírni:
(.[a-zA-Z0-9=:"\'\-_,;]+?)
16

Hogyan lehet kibővíteni a

sandrosdj · 2013. Feb. 14. (Cs), 19.16
Hogyan lehet kibővíteni a következő regexp-et, hogy az else dolog is működjön?
#\{if:lang=(en|hu)\}(.*?)\{/if:lang\}#si
Tehát ne csak így menjen:
{if:lang=hungarian}Magyar{/if:lang}


...hanem így is:
{if:lang=hungarian}Magyar{else:lang=english}English{else}Fogalmam sincs.{/if:lang}
17

Azt a „működjön” illetve

kuka · 2013. Feb. 14. (Cs), 19.23
Azt a „működjön” illetve „menjen” részt fejtsd ki bővebben: milyen bemenő adatból, mi okból, mit kellene eredményezzen?
18

Mindent leírt.

Hidvégi Gábor · 2013. Feb. 14. (Cs), 19.24
Mindent leírt.
19

Adott html tartalomban

sandrosdj · 2013. Feb. 14. (Cs), 19.34
Adott html tartalomban szerepelnek az előző hozzászólásomban említett kapcsoszárójeles részek. A kimenet csak azt a szöveget adja vissza a zárójeles részek közül, amelyik teljesül. A regexp-et preg_replace_callback() php függvénnyel használom, php-ban a nyelv változója legyen $language.

A működését olyannak képzelem, mintha php-ban írnám a kódot, tehát:
if($language=="en") echo "salala"; elseif()....
20

Jelenleg:$errol[] =

sandrosdj · 2013. Feb. 22. (P), 22.24
Jelenleg:
$errol[] = '#\{date:([a-zA-Z_]+)\}#e';
$erre[] = date("\\1");
Ha a $erre[] = "\\1";, akkor undefined konstans (a betű) hibát kapok.

Ötlet, hogy mi lehet a pröblém?

Update: Ha az $erre[] = "date(\\1)";, akkor kiírja az évszámot (Y), de továbbra is van mellette egy hiba:
Use of undefined constant Y - assumed 'Y'


Update 2: $erre[] = "date('\\1')"; <- teljesen jó
21

Ezt használva: $pattern[] =

sandrosdj · 2013. Már. 3. (V), 13.29
Ezt használva:
	$pattern[] = '#\<(h[1-6]|p|span|b|strong|em|i|del|ul|li|ol)>(.*?)\</\1\>#si';
	$replace[] = "{[$1]}$2{[/$1]}";
így rendesen működik:
<b>Sajt</b> = {[ b ]}Sajt{[ /b ]}
de így nem egészen:
<b><i>Sajt</i></b> = {[ b ]}<i>Sajt</i>{[/ b ]}
Mi lehet a baj?
22

Rekurzív

Pepita · 2013. Már. 8. (P), 05.46
Az, hogy ebben az esetben újra kéne hívjad (rekurzívan) a fv-t, amíg van benne egyezés a mintára. Ugyanis a preg_replace sok más társához hasonlóan minta-egyezés (és csere) után az előző egyezés végétől folytatja a minta keresését. Emiatt az egymásba ágyazott egyezések kezeléséről neked kell(ene) gondoskodnod. Erre megoldás lehetne az "e" (eval) módosító, amivel kiemeled az egyező mintát, átadod egy másik fv-nek, abban tudod tovább vizsgálni, hogy van-e több egyezés, és ha van, akkor azzal meghívod saját magát. De ezt igazából nagyon nem javaslom neked, mert valószínűleg hamar futnál végtelen ciklusba, vagy hasonló.

Inkább ajánlom, hogy HTML (XML) feldolgozásához használd a PHP erre való osztályait (DOM Document, DOM XML functions). Ezekkel "könnyedén" tudod kezelni a teljes DOM-fát, minden gyerekkel együtt, nem kell a "kínai" regexp-ekkel kínlódni. És - nem utolsó sorban - nem hinném, hogy kesze-kusza regexp-ekkel jobb/gyorsabb eredményt tudnál elérni.