Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
07.10.2009 16:37:49
php: regulaaravaldis |
|
|
Length 3000 mm 5 pcs
kuidas sellest stringist saaks kätte nüüd 3000 ja 5? neid tühikuid võib olla ka stringi alguses ning lõpuls. sõnade keskel võib kah erinevalt olla tühikuid!
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
tagasi üles |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
07.10.2009 18:24:20
|
|
|
php:
|
$text = "Length 3000 mm 5 pcs"; // '\s*' - 0 või rohkem tühikut/tabi/vms // '\s+' - 1 või rohkem tühikut/tabi/vms // '[0-9]+' - 1 või rohkem numbrit vahemikus 0..9 preg_match('/^ \s* Length \s+ ([0-9]+) \s+ mm \s+ ([0-9]+) \s+ pcs \s* $/x', $text, $matches); echo $matches[1]; // 3000
|
_________________ Mõistus otsas? Pane pinusse... |
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
23 |
|
tagasi üles |
|
 |
Absona
Lõuapoolik

liitunud: 17.09.2008
|
07.10.2009 18:39:35
|
|
|
Kunagi sai C# teha üks funktsioon (puhas stringi töötlus), mis otsib tekstis vajalikke stringe ülesse. Natukene ümber nurga tegemine oli (saab ka lihtsamini regulaaravaldisi kasutades (tol aeg ei osanud veel regulaaravaldisi kasutada) aga see ei aita alati kui tekst on muutuv).
Kood siis selline (C#'is ja ei viitsi PHP'le ümber teha):
public static string[] OtsiStringi(string strAlusta, string strLopeta, string strAllikas,
bool kaasaarvatudAlusta, bool kaasaarvatudLopeta)
{
string[] tulemused = { "", "" };
int iIndeksAlgusest = strAllikas.IndexOf(strAlusta);
if (iIndeksAlgusest != -1)
{
if (kaasaarvatudAlusta)
iIndeksAlgusest -= strAlusta.Length;
strAllikas = strAllikas.Substring(iIndeksAlgusest
+ strAlusta.Length);
int iLopeta = strAllikas.IndexOf(strLopeta);
if (iLopeta != -1)
{
if (kaasaarvatudLopeta)
iLopeta += strLopeta.Length;
tulemused[0] = strAllikas.Substring(0, iLopeta);
if (iLopeta + strLopeta.Length < strAllikas.Length)
tulemused[1] = strAllikas.Substring(iLopeta + strLopeta.Length);
}
}
else
{
tulemused[1] = strAllikas;
}
return tulemused;
}
|
Ehk sinu vajaduse järgi näeks asi selline välja:
private string allikas = "Length 3000 mm 5 pcs";
public void Otsi()
{
string[] otsiMM = OtsiStringi("Length ", " mm ", allikas, false, false);
var MM = otsiMM[0]; // Tulemus: MM = 3000
string[] otsiPCS = OtsiStringi("Length " + MM + " mm ", " pcs", allikas, false, false);
var PCS= otsiPCS[0]; // Tulemus: PCS = 5
}
|
või
private string GetMM
{
get {
string[] otsiMM = OtsiStringi("Length ", " mm ", allikas, false, false);
return otsiMM[0]
}
}
private string GetPCS
{
get {
string[] otsiPCS = OtsiStringi("Length " + GetMM + " mm ", " pcs", allikas, false, false);
return otsiPCS[0];
}
}
|
Ja niimoodi saab igatepidi mängida (paned tsüklisse: otsib ülesse-->lisad listi-->asendad leitud sõna-->otsib uue sõna, jne).
_________________ Veebilehed, veebiprogrammeerimine, veebilahendused
Erinevad rakendused ja skriptid.
viimati muutis Absona 07.10.2009 18:44:12, muudetud 2 korda |
|
Kommentaarid: 11 loe/lisa |
Kasutajad arvavad: |
   |
:: |
2 :: |
0 :: |
8 |
|
tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
07.10.2009 18:44:49
|
|
|
Pole eriti regulaar avaldistega kursis ja alles õpin neid, kuid midagi sellist peaks sulle sobima. Siin ei tohiks segada ka see, kui onveel eespool või tagapool sõnu.
$avaldis=" Length 30045 mm 587 pcs ";
if(ereg ("(Length)( *)([0-9]*)( *)(mm)( *)([0-9]*)( *)(pcs)", $avaldis, $regs)){
echo "Lenght ".$regs[3]." mm ".$regs[7]." pcs";
} |
_________________
 |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
07.10.2009 20:27:22
|
|
|
nene kirjutas: |
php:
|
$text = "Length 3000 mm 5 pcs"; // '\s*' - 0 või rohkem tühikut/tabi/vms // '\s+' - 1 või rohkem tühikut/tabi/vms // '[0-9]+' - 1 või rohkem numbrit vahemikus 0..9 preg_match('/^ \s* Length \s+ ([0-9]+) \s+ mm \s+ ([0-9]+) \s+ pcs \s* $/x', $text, $matches); echo $matches[1]; // 3000
|
|
kle viitsid seletada, mis seal täpselt tehakse? kuidas just see $matches oma väärtuse saab? ma krt vist ei saa neid regulaaravaldisi kunagi selgeks. mingit head tutoriali pole kah leidnud.
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
07.10.2009 20:37:20
|
|
|
Mina õppisin selle järgi, http://koduleht.eu/phpwiki/doku.php?id=regulaaravaldised üks normaalsemaid, mis näinud. Ennem seda lehte oli täiesti must maa, nagu müstika -kõik teevad, kuid mida teevad ei oska või ei taha keegi öelda. Nagu mingi maffia.
tsitaat: |
if(ereg ("(Length)( *)([0-9]*)( *)(mm)( *)([0-9]*)( *)(pcs)", $avaldis, $regs)) |
Esimene sõna Length sellele järgneb suva arv tühikuid teine numbrid üks kuni mitu jne..
$regs on masiiv, milles on otsitavad osad, vaja ainult õige sõna - number välja võtta.
Edit: proovisin oma koodi, kui lükkan sinna ikka täiesti suva teksti sisse selle sinu kirja, leitakse ilma probleemideta ülesse.
$avaldis="<table border=\"0\" style=\"float: left\">
<tr>
<td background=\"vasak.png\" width=\"180\" height=\"700\" style=\"margin: 0\"></td>
</tr>
</table>
<DIV style=\"position: absolute; left: 100px; top: 0px; z-index: 1\" >
<img src=\"kytt.gif\" border=\"0\" width=\"248\" height=\"244\" alt=\"\">
</DIV>
<DIV style=\"position: absolute; left: 400px; top: 50px; z-index: 1\" >
<img src=\"cstlogo.gif\" border=\"0\" width=\"411\" height=\"45\">
</DIV>
<DIV style=\"position: absolute; left: 80px; top: 465px; z-index: 2\" >
erg e Length 30045 mm 587 pcs rg g erg erg erger erg erg
<img src=\"hand1.gif\" border=\"0\" width=\"194\" height=\"238\">
</DIV>
<DIV style=\"position: absolute; left: 700px; top: 500px; z-index: 2\" >
<img src=\"hand2.gif\" border=\"0\" width=\"172\" height=\"122\">
</DIV>";
if(ereg ("(Length)( *)([0-9]*)( *)(mm)( *)([0-9]*)( *)(pcs)", $avaldis, $regs)){
echo "Lenght ".$regs[3]." mm ".$regs[7]." pcs";
} |
_________________
 |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
wk
HV vaatleja
liitunud: 22.05.2007
|
08.10.2009 01:21:39
|
|
|
Kuna Sa eriti ei selgitanud, kui palju lähteandmed muutuvad, pakuksin sellise lahenduse, mis toimib ridadega, kus alul on mittenumbrid, siis numbrid, siis mittenumbrid siis jälle numbrid ja lõpuks jälle mittenumbrid. Kui mõni element siit pole kohustuslik või võib sisaldada numbreid, siis see ei toimi õigesti.
$text = "Length 3000 mm 5 pcs";
preg_match('/^\D+(\d+)\D+(\d+)\D+$/x', $text, $matches);
echo $matches[1]; // 3000
echo $matches[2]; // 5 |
_________________ Kõike hääd,
WK |
|
Kommentaarid: 8 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
09.10.2009 00:26:49
|
|
|
Õpetustega on üldiselt nigelad lood. Eriti eesti keeles. Ka too ülalviidatud pole mu meelest just suurem asi - pealegi õpetab ta kasutama PHP ereg funktsioone, mille asemel on juba aastaid soovitatud kasutada preg (Perl Compatible Regular Expressions) funktsioone, mis on märksa võimalusterohkemad ja pealegi ka kiiremad.
Lisaks on regulaaravaldiste temaatika väga lai, alates lihtsatest failinimede mustritest *.txt mida mõistab enamik arvutikasutajaid, lõpetades regulaarsete keelte ja lõplike automaatide teooriaga, millest kirjutatakse ülikoolides teadustöid.
Kõige lihtsam on vast regulaaravaldisi õppida kui piirduda alustuseks väikse alamhulgaga, näiteks alljärgnevaga:
Iga regulaaravaldis koosneb lihtsümbolitest ja erisümbolitest.
Erisümboleid on meie lihtsas regulaaravadiste keeles viis: *, +, (, | ja ) - nende tähendusest allpool. Kõik ülejäänud on lihtsümbolid ja nemad tähistavad iseennast. Näiteks a tähistab tähte "a", b tähte "b" jne.
| tähistab valikut. Näiteks avaldisele jaan|mari vastavad kaks sõna: "jaan" ja "mari". Avaldisele 0|1|2|3|4|5|6|7|8|9 vastab suvaline number vahemikust 0..9.
() sulud tähistavad grupeerimist. Näiteks avaldisele k(e|u)s vastavad sõnad "kes" ja "kus". Avaldisele ninja(d|) vastavad sõnad "ninjad" ja "ninja".
* tähistab et talle eelnevat asja on suvaline arv. Näiteks avaldisele ha* vastavad sõnad "h", "ha", "haa", "haaa", "haaaa" jne. Avaldisele 0|1(0|1)* vastavad kahendsüsteemi numbrid "0", "1", "10", "11", "100"... õigupoolest kõikvõimalikud kahendsüsteemi numbrid.
+ tähistab et talle eelnevat asja on üks või rohkem. Näiteks avaldisele ab+a vastavad sõnad "aba", "abba", "abbba" jne. Avaldis pisi(kese|kene)+ on samaväärne avaldisega pisi(kese|kene)(kese|kene)* - mõlevale vastavad sõnad "pisikese", "pisikene", "pisikesekene", "pisikesekenekesekesekene" jne - kuid + märgi abil on saab avaldis lühemalt kirja.
Antud lihtsat keelt kasutades on võimalik kirja panna kõikvõimalikud regulaaravaldised. See pole küll alati kõige mugavam, aga võimalik. Muuhulgas saab kirja panna ka tolle avaldise, mis sobitub tekstiga "Length 3000 mm 5 pcs", kus 3000 ja 5 asemel võivad olla suvalised arvud ja ka tühikuid võib sõnade vahel olla rohkem kui üks:
Length +(0|1|2|3|4|5|6|7|8|9)+ +mm +(0|1|2|3|4|5|6|7|8|9)+ +pcs
Sellega peaksid regulaaravaldiste põhitõed selged olema. Siit pealt peaks andma juurde õppida veel kõiksuguseid erisümboleid, mis regulaaravaldiste kirjutamist hõlbustavad.
_________________ Mõistus otsas? Pane pinusse... |
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
23 |
|
tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
09.10.2009 12:42:08
|
|
|
tsitaat: |
// '\s+' - 1 või rohkem tühikut/tabi/vms |
Ma proovisin seda oma näites
tühikute asemele panna, kuid ei toiminud. Kas kirjutasin kuidagi valesti? Muidu kui minu näites panna vahele tab, siis asi enam ei toimi, kuigi kes ikka kahe sõna vahele tabi paneb, kuid mine sa tea.
_________________
 |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
tooming
HV vaatleja

liitunud: 19.03.2007
|
09.10.2009 15:00:01
|
|
|
(0|1|2|3|4|5|6|7|8|9) - kas see on sama, mis (0-9) ?
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
tagasi üles |
|
 |
linnumees
HV kasutaja
liitunud: 15.06.2005
|
10.10.2009 17:10:43
|
|
|
Jah. Või õigemini siis ([0-9]).
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
3 |
|
tagasi üles |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
12.10.2009 20:29:20
|
|
|
andrusny kirjutas: |
Ma proovisin oma näites \s+ tühikute asemele panna, kuid ei toiminud. |
Kui sa kasutasid ereg funktsiooni, siis väga vabalt ei pruugi see toetatud olla. Aga ereg on deprecated ning PHP 6-s hoopis eemaldatud - parem hoidu sellest.
_________________ Mõistus otsas? Pane pinusse... |
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
23 |
|
tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
27.10.2009 02:21:15
|
|
|
ereg('^/', $url_path)
kuidas see preg_matchina välja näeks
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
tagasi üles |
|
 |
ranel
HV Guru
liitunud: 28.02.2005
|
27.10.2009 03:14:50
Re: php: regulaaravaldis |
|
|
keevitaja kirjutas: |
Length 3000 mm 5 pcs
kuidas sellest stringist saaks kätte nüüd 3000 ja 5? neid tühikuid võib olla ka stringi alguses ning lõpuls. sõnade keskel võib kah erinevalt olla tühikuid! |
see 3000 koha peal on alati neljakohaline ja 5 juures alati ühekohaline?
_________________ Mobiilne rehvivahetus Lõuna-Eestis ja rehvide tellimine üle Eesti. www.rsrehvid.ee 53 843 843 |
|
Kommentaarid: 186 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
165 |
|
tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004

|
27.10.2009 09:50:08
|
|
|
ranel, väga väga halb eeldus on see.
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
 |
ranel
HV Guru
liitunud: 28.02.2005
|
27.10.2009 11:35:34
|
|
|
mikk36 kirjutas: |
ranel, väga väga halb eeldus on see. |
no ma küsin, kas on kui ongi, siis teeb see asja märksa lihtsamaks ju
_________________ Mobiilne rehvivahetus Lõuna-Eestis ja rehvide tellimine üle Eesti. www.rsrehvid.ee 53 843 843 |
|
Kommentaarid: 186 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
165 |
|
tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
27.10.2009 11:37:44
|
|
|
see esialgne probleem on ammu lahenduse saanud!
teab keegi kuidas saaks selle preg_matchina kirjutada?
ereg('^/', $url_path)
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004

|
27.10.2009 11:56:37
|
|
|
keevitaja, täpselt sama ei sobi?
^ tähendab nii POSIX'is kui PCRE's stringi algust ja / ei ole spets sümbol nagu.
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
27.10.2009 12:56:14
|
|
|
hakkas karjuma jah... vaja nii, et kui string hakkb / siis teeme ühte, kui mitte, siis teist
$kala = (ereg()) ? 'dddd' : 'ffff';
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004

|
27.10.2009 13:18:07
|
|
|
!^/!
#php freenode serveris alati abiks
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
27.10.2009 13:47:44
|
|
|
mis freenode?
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004

|
27.10.2009 14:00:38
|
|
|
irc.freenode.org
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
30.10.2009 23:08:52
|
|
|
no ei saa pihta...
$string1 = '/see/on/mingi/kataloog';
$string1 = '/see/on/mingi/kataloog/';
kuidas saaks nüüd sellise avaldise, et võtaks alati viimase kataloogi tagant ära? üritan midagi sellist, kuid saan error
$text = preg_replace("!(\/|([:word:]))$!", '', $text);
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
tagasi üles |
|
 |
mark11
HV vaatleja
liitunud: 28.01.2006
|
31.10.2009 12:12:38
|
|
|
print_r(preg_replace("@/\w+/?$@", "", array("/path/naa", "/path/lawl/"))); |
katseta.
üldiselt võiksid selle kõik pähe tuupida&aru saada: http://www.regular-expressions.info/ siis vast probleeme ei tule :p
ja kui sul pole vaja seda visuaalsel levelil teha, siis lihtsalt lõppu paned "/../"
mikk36 kirjutas: |
!^/!
#php freenode serveris alati abiks |
pigem ikka #regex, seal on tõsised fanaatikud :p
|
|
Kommentaarid: 1 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
1 |
|
tagasi üles |
|
 |
laurik
HV vaatleja
liitunud: 30.01.2003
|
31.10.2009 13:29:24
|
|
|
keevitaja kirjutas: |
no ei saa pihta...
$string1 = '/see/on/mingi/kataloog';
$string1 = '/see/on/mingi/kataloog/';
kuidas saaks nüüd sellise avaldise, et võtaks alati viimase kataloogi tagant ära? üritan midagi sellist, kuid saan error
$text = preg_replace("!(\/|([:word:]))$!", '', $text); |
Võibolla abiks dirname-funktsioon:
echo dirname("/see/on/mingi/kataloog/"); |
See väljastab: /see/on/mingi
_________________ http://web.zone.ee/internetu/ |
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
3 |
|
tagasi üles |
|
 |
|