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 |
#3 · Zasláno: 30. 10. 2018, 22:04:27
dekuji
|
||
Taps Profil |
#4 · Zasláno: 31. 10. 2018, 16:07:20
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 |
#5 · Zasláno: 31. 10. 2018, 17:07:27
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“).
|
||
Časová prodleva: 5 let
|
0