| 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: 7 let
|
|||
0