Autor Zpráva
Taps
Profil
Zdravím, mám níže uvedený kód a pomocí regulárního výrazu potřebuji získat přesnou shodu slova. Bohužel kod mi však vrací i hodnotu iPhone 6, což nechci. Mohl by mi prosím někdo poradit jak kod upravit.Děkuji

<?php
$manual_tags = ['iPhone 6','iPhone 6 Plus\/6s','iPhone 8\/7'];

foreach($manual_tags as $key){
        preg_match_all('/\b'.$key.'\b/i','testovací iPhone 6 Plus/6s je ihned k vyzkoušení',$matches,PREG_SET_ORDER,0);
  print_r($matches);

}

?>
juriad
Profil
Taps:
Tady jde spíš o to, že iPhone 6 je podslovem iPhone 6 Plus\/6s. Musíš tedy hledat ve správném pořadí (od nejdelšího):

$manual_tags = ['iPhone 6','iPhone 6 Plus/6s','iPhone 8/7'];
rsort($manual_tags); # seřaď podle abecedy a délky pozpátku
foreach ($manual_tags as &$mt) {
    $mt = preg_quote($mt, '/'); # oescapuj
}
$re = '/\b(?:(?:' . implode(')|(?:', $manual_tags) . '))\b/i'; # spoj vše do jedné alternativy
 
preg_match_all($re,'testovací iPhone 6 Plus/6s je ihned k iphone 8/7 vyzkoušení',$matches,PREG_SET_ORDER,0);
print_r($matches);
Taps
Profil
dekuji
Taps
Profil
juriad:
A je možné i nějak ošetřit situaci, v případě, že v poli $manul_tags nebude hodnota iPhone 6 Plus/6s, aby skript nebral hodnotu iPhone 6?
Joker
Profil
Taps:
To je složitější, protože řetězec „iPhone 6 Plus“ skutečně obsahuje „iPhone 6“.

Pokud by každý název byl samostatný řetězec, šlo by použít iPhone 6$, ale to neodchytí „iPhone 6“ následované čímkoliv dalším.

Pokud to je uvnitř věty, šlo by použít záporné tvrzení o následujícím: iPhone 6(?! Plus) (tedy zachytí řetězec „iPhone 6“, pokud za ním nenásleduje „ Plus“).

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0