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.
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.
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.
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';
Aihe on jo aika vanha, joten et voi enää vastata siihen.