Cresciuto nel settore giovanile del Cannes, squadra della sua città natale, nel 2016 si trasferisce al Niort. L'allenatore della prima squadra Denis Renaud decide di convocare il tunisino per le prime tre gare amichevoli della tournée estiva. Le sue prestazioni sopra le aspettative gli valsero la chiamata in prima squadra con il suo conseguente debutto il 29 luglio in un pareggio contro il Lens.[3] Il 18 ottobre firma il primo contratto professionistico.[4]
Gent
Il 31 luglio 2017 viene acquistato dal Gent, legandosi al club belga fino al 2021.[5] Debutta con il club belga il 20 settembre seguente in una gara valida per la Croky Cup vinta per 3-2 in casa del Geel.[6] Farà il suo esordio in Jupiler Pro League il 6 agosto in un incontro casalingo perso contro l'Anversa (0-1).[7] Tre mesi dopo metterà a segno la sua prima rete in una gara contro il Royal Excelsior Mouscron.[8] Gli sarà particolarmente fruttuosa l'annata 2018-2019 dove, in 19 presenze di campionato, è riuscito a timbrare per 7 volte. Nel corso dell'annata 2019-2020 avrà anche l'occasione di poter debuttare in Europa League in un match contro i francesi del Saint-Étienne,[9] ma nonostante ciò il giocatore verrà escluso totalmente dai piani della rosa verso l'inizio di novembre.
Metz
Il 3 gennaio 2020 passa al Metz, con cui firma un quinquennale.[10] Fa il proprio debutto con i francesi tre giorni dopo in una gara di Coupe de France persa contro il Rouen (3-0),[11] mentre cinque giorni più tardi debutterà ufficialmente in Ligue 1 in una vittoria contro lo Strasburgo (1-0).[12] Conclude la sua prima annata con 9 presenze in campionato. L'annata successiva il giocatore verrà impiegato come titolare e in alcune occasioni avrà anche modo di vestire la fascia da capitano. Il 13 dicembre 2020, in una gara contro lo Strasburgo, trova la sua prima rete della sua esperienza.[13] La stagione successiva sarà scelto ufficialmente come capitano, terminandola totalizzando 30 presenze.
Salernitana e prestito al Servette
Il 12 agosto 2022 lascia, da capitano, la squadra del Metz e firma un contratto triennale con la Salernitana.[14][15] Esordisce in maglia granata due giorni dopo, nella partita casalinga contro la Roma, persa per 1-0, dove gioca titolare.[16] Durante la prima parte di stagione il giocatore verrà impiegato quasi sempre da titolare, salvo poi calare di rendimento dopo un infortunio alla coscia rimediato in allenamento.[17] Tuttavia, termina l'annata 2022-2023 totalizzando 24 presenze. La stagione successiva, dopo l'approdo in panchina di Filippo Inzaghi, il giocatore viene escluso dall'elenco dei convocati per il campionato assieme al compagno Erik Botheim,[18] salvo poi essere reintegrato nel mese di novembre date le assenze nel reparto. Dopo 48 minuti giocati in 4 presenze, nel febbraio 2024 viene nuovamente messo fuori rosa per facilitare l'approdo in granata di Kōstas Manōlas.[19]
Il 15 febbraio 2024 viene ufficializzata la sua cessione in prestito al Servette fino alla fine della stagione.[20][21] Debutta ufficialmente con il club tre giorni dopo nella vittoria interna contro il Lugano.[22][23]
Nazionale
Convocato per la prima volta con la nazionale tunisina il 14 marzo 2017,[24] ha debuttato con la selezione nordafricana il 28 marzo, disputando da titolare l'amichevole persa per 1-0 contro il Marocco.[25][26]