Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: RegEx: Ei merkkejä ollenkaan tai muu kuin tietty merkki

AkeMake [24.10.2016 19:47:26]

#

Haluaisin hyväksyä merkkijonon, jonka lopussa voi olla mitä tahansa muita merkkejä paitsi tiettyjä tai tilanteen, jossa lopussa ei ole merkkejä ollenkaan. Vaikea selittää eikä tainnut tuo selitys edes mennä oikein, joten annan esimerkin. Olen yrittänyt ratkaista tilannetta tällä lausekkeella:

$regex = '/iphone ?6[^0-9s]?/i';
$string1 = 'iPhone 6 siisti 32gb';
$string2 = 'iPhone 6S puhelin';
$string3 = 'iPhone 64GB';
$string4 = 'iPhone6';
preg_match($regex, $string1); // Pitäisi olla TRUE
preg_match($regex, $string2); // Pitäisi olla FALSE
preg_match($regex, $string3); // Pitäisi olla FALSE
preg_match($regex, $string4); // Pitäisi olla TRUE

Ymmärrän kyllä hyvin miksei tämä lauseke toimi, mutta en vain keksi millä tuon saisi toimimaan.

jlaire [24.10.2016 19:49:22]

#

Kokeile vaikka näitä:

$regex = '/iphone ?6\b/i';
$regex = '/iphone ?6([^0-9s].*)?$/i';
$regex = '/iphone ?6([^0-9s]|$)/i';

Tällaisissa tilanteissa \b on hyvä tietää. Viimeinen regex taitaa vastata kuvaustasi tarkinten.

Käytin selkeyden vuoksi pelkkiä sulkuja, mutta tilalle voi vaihtaa (?:)-rakenteen siisteyden vuoksi.

AkeMake [24.10.2016 20:26:56]

#

Sehän toimii. Kiitos! Oma osaamiseni olisi pitänyt kyllä riittää ainakin tuon toisen vaihtoehdon keksimiseen, mutta aina ei vain välähdä. Ja nytpä tuli luettua myös tuosta \b:n käytöstä, niin osaa vastaisuudessa sitäkin hyödyntää.

Tuo (?:)-rakenne on minulle täysin tuntematon. Osaamiseni RegEx:ssä rajoittuu pitkälti PHP-oppaassa käsiteltyjen asioiden tasolle.

jlaire [24.10.2016 20:52:26]

#

Sulut ajavat kahta eri tarkoitusta: Niillä voi ryhmitellä asioita, kuten tässä, ja niiden sisällä olevat osat kerätään matchin aikana taulukkoon (jos sellaisen antaa preg_match:n kolmantena argumenttina).

Jos ei välitä sulkujen sisällä matchanneestä osasta ja käyttää niitä pelkästään ryhmittelyyn, voi (...) sijaan kirjoittaa (?:...).

$regex = '/iphone ?6(?:[^0-9s]|$)/i';

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta