Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[regular expressions] zamiana 2 lub wiecej znakow na 1

34 views
Skip to first unread message

Maniek

unread,
Jul 1, 2011, 7:43:03 AM7/1/11
to
Witam

Jak za pomocą preg_replace zamienić tekst, w którym dany znak
powtarza się 2razy lub więcej np:

________test____tes__test_asd
zamienić na:
_test_tes_test_asd

Pozdrawiam
Maniek

Arson

unread,
Jul 1, 2011, 8:57:55 AM7/1/11
to
W dniu 01.07.2011 13:43, Maniek pisze:

> Jak za pomocą preg_replace zamienić tekst, w którym dany znak
> powtarza się 2razy lub więcej np:
>
> ________test____tes__test_asd
> zamienić na:
> _test_tes_test_asd

(_){2,}

Pozdrawiam,
Arson

Arson

unread,
Jul 1, 2011, 9:01:37 AM7/1/11
to
W dniu 01.07.2011 14:57, Arson pisze:
> (_){2,}
>

Sorki - powinno być tak:
(_{2,})

lub nawet tak:
_{2,}

...zależy jak będzie ci wygodniej podmieniać

Pozdrawiam,
Arson

aaaa

unread,
Jul 1, 2011, 9:52:32 AM7/1/11
to
A dlaczego z użyciem regexp skoro można bez?

1)
white (strpos($s, '__') !== false)
{
$s = str_replace('__', '_', $s);
}

2)
$temp = explode('_', $s);
foreach ($temp AS &$t)
{
$t = trim($t, '_');
}
$s = implode('_', $temp);

3)
$s2 = $s[0];
for ($i=1; $i<strlen($s); $i++)
{
if ($s[$i-1] == '_' and $s[$i] == '_') continue;
$s2 .= $s[$i];
}

--
A


aaaa

unread,
Jul 1, 2011, 10:02:03 AM7/1/11
to
Przepraszam, ale 2 jest źle. Powinno być:

$temp = explode('_', '!'.$s.'!');
foreach ($temp AS $i=>$t)
{
if ($t == '') unset($temp[$i]);
}
$s = substr(implode('_', $temp), 1, -1);

--
A

aaaa

unread,
Jul 1, 2011, 10:13:49 AM7/1/11
to
4)
$s = strtr('Q'.$s.'Q', '_', ' ');
$temp = str_word_count($s, 2);

Łukasz.K

unread,
Jul 2, 2011, 8:07:38 AM7/2/11
to
Mam propozycję, abyś nie śmiecił głupotami. Dziękuję.

aaaa

unread,
Jul 2, 2011, 8:37:49 AM7/2/11
to
Zmień czytnik, bo nie wiadomo komu odpowiadasz.

--
A

Łukasz.K

unread,
Jul 2, 2011, 9:04:11 AM7/2/11
to
Dobrze wiesz, kto tu wypisuje głupoty, ale - dla pewności - napiszę, że pisałem o Twoich wymysłach. Marsz do książek, a potem doradzaj - nie zwiększaj entropii.

aaaa

unread,
Jul 2, 2011, 1:36:57 PM7/2/11
to
>Dobrze wiesz, kto tu wypisuje głupoty, ale - dla pewności - napiszę, że
>pisałem o Twoich wymysłach.
>Marsz do książek, a potem doradzaj - nie zwiększaj entropii.

Podałem 4 dobre odpowiedzi na zadany problem. To, że ich nie rozumiesz to
nie znaczy, że to "śmieci".
Wyrażenia regularne do tak banalnych zadań to armata na muchy. W dodatku
wolna armata. Jeśli tego nie wiesz- marsz do książek...

--
A

Borys Pogoreło

unread,
Jul 2, 2011, 4:22:22 PM7/2/11
to
Dnia Sat, 2 Jul 2011 05:07:38 -0700 (PDT), Łukasz.K napisał(a):

> Mam propozycję, abyś nie śmiecił głupotami. Dziękuję.

Mam propozycję, abyś nie psuł wątkowania. Dziękuję.

--
Borys Pogoreło
borys(#)leszno,edu,pl

Łukasz.K

unread,
Jul 2, 2011, 4:50:49 PM7/2/11
to
On 2 Lip, 22:22, Borys Pogoreło <bo...@pl.edu.leszno> wrote:
> Dnia Sat, 2 Jul 2011 05:07:38 -0700 (PDT), Łukasz.K napisał(a):
>
> > Mam propozycję, abyś nie śmiecił głupotami. Dziękuję.
>
>  Mam propozycję, abyś nie psuł wątkowania. Dziękuję.
>

Pretensje do google. Uważasz, że pisałem ich oprogramowanie? I po co
wcinasz się, gdy koleś wypisuje pierdoły? Rozumiem, że Ty też uważasz,
że zastosowanie jakichś protez czy innych śmieci to super rozwiązanie,
kiedy starczy jeden regex.

Łukasz.K

unread,
Jul 2, 2011, 5:27:34 PM7/2/11
to

Więcej się nie odezwę, bo widzę, że nie ma sensu z takim kimś
dysktuować.

1. Twój kod to śmieci.
2. Regeksy powstały do obsługi takich właśnie problemów.
3. Bzdury o wydajności załatwia prosty test: http://ideone.com/NvOQy -
w PHP 5.3 jest jeszcze lepiej
4. Przynajmniej dwie z Twoich funkcji (funkcji?) są błędne.
5. Jedynym poprawnym rozwiązaniem jest użycie preg_replace()

Borys Pogoreło

unread,
Jul 2, 2011, 6:23:51 PM7/2/11
to
Dnia Sat, 2 Jul 2011 13:50:49 -0700 (PDT), �ukasz.K napisa�(a):

>> �Mam propozycj�, aby� nie psu� w�tkowania. Dzi�kuj�.
>
> Pretensje do google. Uwa�asz, �e pisa�em ich oprogramowanie?

Czyli jeste� �wiadom problemu, ale masz innych w d*.

> I po co
> wcinasz si�, gdy kole� wypisuje pierdo�y? Rozumiem, �e Ty te� uwa�asz,
> �e zastosowanie jakich� protez czy innych �mieci to super rozwi�zanie,
> kiedy starczy jeden regex.

Oczywi�cie, �e to dobre rozwi�zanie, cho� nie wiem czy akurat w tym
przypadku. Du�o si� nie zyska.

--
Borys Pogore�o
borys(#)leszno,edu,pl

Borys Pogoreło

unread,
Jul 2, 2011, 6:27:42 PM7/2/11
to
Dnia Sat, 2 Jul 2011 14:27:34 -0700 (PDT), �ukasz.K napisa�(a):

> 5. Jedynym poprawnym rozwi�zaniem jest u�ycie preg_replace()

A �r�d�o takiej niezachwianej pewno�ci, to...?

Łukasz.K

unread,
Jul 2, 2011, 6:28:25 PM7/2/11
to
On 3 Lip, 00:23, Borys Pogoreło <bo...@pl.edu.leszno> wrote:
> Dnia Sat, 2 Jul 2011 13:50:49 -0700 (PDT), ukasz.K napisa (a):
>
> >> Mam propozycj , aby nie psu w tkowania. Dzi kuj .
>
> > Pretensje do google. Uwa asz, e pisa em ich oprogramowanie?
>
>  Czyli jeste wiadom problemu, ale masz innych w d*.

Może akurat nie mam nic innego pod ręką?

>
> > I po co
> > wcinasz si , gdy kole wypisuje pierdo y? Rozumiem, e Ty te uwa asz,
> > e zastosowanie jakich protez czy innych mieci to super rozwi zanie,
> > kiedy starczy jeden regex.
>
>  Oczywi cie, e to dobre rozwi zanie, cho nie wiem czy akurat w tym
> przypadku. Du o si nie zyska.
>

Mam nadzieję, że piszesz o regeksach.

Borys Pogoreło

unread,
Jul 2, 2011, 6:32:36 PM7/2/11
to
Dnia Sat, 2 Jul 2011 15:28:25 -0700 (PDT), �ukasz.K napisa�(a):

>> �Czyli jeste wiadom problemu, ale masz innych w d*.
>
> Mo�e akurat nie mam nic innego pod r�k�?

Teraz psujesz polskie literki...

>> �Oczywi cie, e to dobre rozwi zanie, cho nie wiem czy akurat w tym


>> przypadku. Du o si nie zyska.
>

> Mam nadziej�, �e piszesz o regeksach.

O operacjach na stringach, naturalnie.

Łukasz.K

unread,
Jul 2, 2011, 6:35:28 PM7/2/11
to
On 3 Lip, 00:32, Borys Pogoreło <bo...@pl.edu.leszno> wrote:
> Dnia Sat, 2 Jul 2011 15:28:25 -0700 (PDT), ukasz.K napisa (a):
>
> > Mam nadziej , e piszesz o regeksach.

>
>  O operacjach na stringach, naturalnie.
>

Tych str_replace() itp.? No to cóż.. straciłem nieco wiary w Twoje
umiejętności, a była ona spora.

voytASS

unread,
Jul 3, 2011, 3:14:28 AM7/3/11
to

A może wystarczy poczytać manuala, zanim się zacznie wygłaszać takie opinie?
http://pl.php.net/manual/pl/function.str-replace.php
"str_replace
If you don't need fancy replacing rules (like regular expressions), you
should always use this function instead of preg_replace()."

--
wojtas
http://jwmprojekt.pl

Wojciech Bancer

unread,
Jul 3, 2011, 5:13:55 AM7/3/11
to
On 2011-07-03, voytASS <wojt...@wp.pl.WYTNIJ.TO> wrote:

[...]

> A mo�e wystarczy poczyta� manuala, zanim si� zacznie wyg�asza� takie opinie?


> http://pl.php.net/manual/pl/function.str-replace.php
> "str_replace
> If you don't need fancy replacing rules (like regular expressions), you
> should always use this function instead of preg_replace()."

Wiesz, ale tak argumentuj�c, to _zawsze_ mo�na zast�pi� wyra�enia regularne,
konstrukcjami opartymi o inne funkcje, wi�c warunek "need" nie jest nigdy
spe�niony.

--
Wojciech Ba�cer
pro...@post.pl

Łukasz.K

unread,
Jul 3, 2011, 7:26:36 AM7/3/11
to
On 3 Lip, 09:14, voytASS <wojta...@wp.pl.WYTNIJ.TO> wrote:
> Dnia 03-07-2011 00:35 Łukasz.K napisał:
>
> > On 3 Lip, 00:32, Borys Pogoreło<bo...@pl.edu.leszno>  wrote:
> >> Dnia Sat, 2 Jul 2011 15:28:25 -0700 (PDT), ukasz.K napisa (a):
>
> >>> Mam nadziej , e piszesz o regeksach.
>
> >>   O operacjach na stringach, naturalnie.
>
> > Tych str_replace() itp.? No to cóż.. straciłem nieco wiary w Twoje
> > umiejętności, a była ona spora.
>
> A może wystarczy poczytać manuala, zanim się zacznie wygłaszać takie opinie?http://pl.php.net/manual/pl/function.str-replace.php

> "str_replace
> If you don't need fancy replacing rules (like regular expressions), you
> should always use this function instead of preg_replace()."
>

Może trzeba pomyslec?

"If you don't need fancy replacing rules **(like regular
expressions)**"

Tu wystapil problem klasy, do rozwiazywania ktorej powstaly wyrazenia
regularne! Tak tez, **you need fancy replacing rules like regular
expressions**!

Zapewniam Cie, ze o ile manual PHP to niezle zrodlo wiedzy o PHP, to
nie oznacza, ze jest jakakolwiek wyrocznia dla dobrego programisty
(nawet osmiele sie stwierdzic, ze czesto jest na odwrot). Nie uwazasz
tez troche, ze to debilne - w obliczu testu, ktory napisalem - bronic
rozwiazan niepoprawnych? Ani one szybsze, ani trafniejsze. Z punktu
widzenia elegancji kodu - nie do przyjecia.

Łukasz.K

unread,
Jul 3, 2011, 7:31:37 AM7/3/11
to
On 3 Lip, 11:13, Wojciech Bancer <prot...@post.pl> wrote:
> On 2011-07-03, voytASS <wojta...@wp.pl.WYTNIJ.TO> wrote:
>
> [...]
>
> > A mo e wystarczy poczyta manuala, zanim si zacznie wyg asza takie opinie?

> >http://pl.php.net/manual/pl/function.str-replace.php
> > "str_replace
> > If you don't need fancy replacing rules (like regular expressions), you
> > should always use this function instead of preg_replace()."
>
> Wiesz, ale tak argumentuj c, to _zawsze_ mo na zast pi wyra enia regularne,
> konstrukcjami opartymi o inne funkcje, wi c warunek "need" nie jest nigdy
> spe niony.
>

Tez masz racje :) Chlopaki pisza wlasna wersje wyrazen regularnych -
niezoptymalizowanych, nieeleganckich, malo ogolnych, blednych... ale
ciezko wytlumaczyc, ze po prostu ktos to juz napisal (pol wieku temu!)
i ten ktos byl wysokiej klasy inzynierem, a nie pseudo-koderem.

Borys Pogoreło

unread,
Jul 3, 2011, 7:50:15 AM7/3/11
to
Dnia Sun, 3 Jul 2011 04:26:36 -0700 (PDT), �ukasz.K napisa�(a):

> "If you don't need fancy replacing rules **(like regular
> expressions)**"

Zwyk�e kryterium zdrowego rozs�dku. Niekt�rzy, co wida� te� po pytaniach
na grupie, pr�buj� stosowa� wyra�enia regularne do wszystkiego, ��cznie z
parsowaniem kilobajt�w HTML-a.

> tez troche, ze to debilne - w obliczu testu, ktory napisalem - bronic
> rozwiazan niepoprawnych? Ani one szybsze, ani trafniejsze. Z punktu
> widzenia elegancji kodu - nie do przyjecia.

Ale "elegancja" kodu nie jest priorytetem. IMO powinna to by� czysto��
(nie musi by� "elegancka"!) i wydajno��. Co do Twojego przyk�adu - je�li to
mia�oby by� jednorazowe u�ycie, to te� bym nie filozofowa� i u�y� regexpa.
Ale je�li to mia�by by� fragment jakiej� funkcji (np. metody do generowania
"czystych" URL-i) to bym si� zastanowi� nad czym� d�u�szym, ale
potencjalnie wydajniejszym. I tak przez 99.999% czasu bym tego nie ogl�da�,
a jedynie wywo�ywa�. Oczywi�cie, o ile tylko sk�rka jest warta wyprawki :)

Borys Pogoreło

unread,
Jul 3, 2011, 8:35:07 AM7/3/11
to
Dnia Sun, 3 Jul 2011 13:50:15 +0200, Borys Pogore�o napisa�(a):

> potencjalnie wydajniejszym. I tak przez 99.999% czasu bym tego nie ogl�da�,
> a jedynie wywo�ywa�. Oczywi�cie, o ile tylko sk�rka jest warta wyprawki :)

Z czystej ciekawo�ci sprawdzi�em jak te rozwi�zania si� skaluj� dla
wi�kszych danych, a nie kilkunastu bajt�w.

Wynik: http://i.imgur.com/u6dMf.png

Seria 1 - regexp
Seria 2 - str_replace na kilku '_' powt�rzonych razy pot�gi dw�jki
(przypadek szczeg�lny, wydajno�� znacznie spada dla wi�kszych N)
Seria 3 - str_replace w p�tli

Czyli optymalizacja tego nie ma wi�kszego sensu.

Łukasz.K

unread,
Jul 3, 2011, 9:04:06 AM7/3/11
to
Elegancja to podstawa - utrzymanie kodu jest wazniejsze niz wydumane
korzysci z niby to zoptymalizowanego podejscia do problemu. Co jesli
zamiast _{2,} ktos zapragnie nagle zamieniac [^a-zA-Z0-9]+ ???? Ile
pracy trzeba włożyć? Ile wysiłku musiałby włożyć inny programista,
żeby się połapać po co to i dlaczego nie jest to regexp?

Bonusowo:

Poza tym test pokazal, ze REGEXP JEST WYDAJNIEJSZY w przypadku
wskazanym przez Autora watku. Dwukrotnie! Natomiast, gdyby Autor
zastosowal rozwiazanie 2) lub 4) niesmialego kolegi aaaaaaa, to bylby
w tarapatach, bo funkcja dzialalaby zle. Doszloby bezsensowne
sprawdzanie bledu, i rozgryzanie problemu rozgryzionego pol wieku
temu, jak juz pisalem.

Opcja 3) tez jest niepoprawna, bo zaklada uzycie jedynie niepustych
lancuchow znakow, ale to akurat da sie latwo poprawic przez dodanie
warunku przed cala akcja. To samo tyczy się braku obsługi unikodu - to
mozna załatwić zamieniając strlen() na mb_strlen() - ale zawsze trzeba
coś zrobić - rozwiązanie jest mało poprawne. (Co prawda w większości
przypadków zadziała dobrze, ale znajdzie się pewnie taka kombinacja
bajtów, dla której zadziała źle). Jedynie opcja 1) wydaje się możliwa
do zaakceptowania, ale również mam wątpliwości, czy pociągnie to
unikod. Funkcja strpos() na pewno nie powinna być użyta.

Łukasz.K

unread,
Jul 3, 2011, 9:07:47 AM7/3/11
to
Dodam tylko, że wszelkie rozważania na temat wydajności wywołania
jednej funkcji (ile razy? niech będzie i 1000!) nie mają sensu, bo
cały system powinien działać wydajnie i to nie jest jakaś wielka
przeszkoda dla niego.

0 new messages