Iran draw sends Senegal into last 32 as Africa secures seven knockout spots
Iran draw sends Senegal into last 32 as Africa secures seven knockout spots
Read this story aloud
Listen to the clean text version of this article
Ready
5 min listen
Audio reading is not supported on this browser.
Although the draw benefited Senegal, Iran remains in contention to reach the World Cup knockout stage for the first time in their history
Senegal booked their place in the World Cup Round of 32 without kicking a ball on Friday after Iran’s 1-1 draw with Egypt mathematically confirmed the Lions of Teranga as one of the tournament’s eight best third-placed teams.
Pape Thiaw’s side had done their part emphatically with a commanding 5-0 victory over Iraq to finish their group campaign, but they still needed results elsewhere to go their way.
Those favours arrived as Uruguay were eliminated following their defeat to Spain, before Iran’s stalemate against Egypt removed another potential challenger for one of the coveted best third-place berths.
More To Read
- Records tumble as historic 2026 FIFA World Cup group stage rewrites football history
- Canada beats <a href="https://absafricatv.com/traveling-to-south-africa-heres-what-to-know-about-the-june-30-protests-travel-noire/" title="Traveling To South Africa? Here’s What To Know About The June 30 Protests – Travel Noire”>South Africa to reach FIFA World Cup round of 16 for first time
- 2026 World Cup knockout fixtures set after thrilling group stage
- Messi makes World Cup history as Argentina complete perfect group stage while Algeria survive dramatic finale to seal knockout spot
- DR Congo end 52-year World Cup wait with historic first victory to reach knockout round
- Kane becomes England’s all-time World Cup top scorer as Croatia edge Ghana to clinch knockout spot
The outcome means Senegal is now guaranteed a place in the knockout rounds, becoming the seventh African nation to qualify for the Round of 32.
Morocco, South Africa, Cape Verde, Ghana, Egypt, the Ivory Coast, and now Senegal have all progressed, while Algeria and DR Congo still have an opportunity to increase Africa’s representation in the knockout phase when they play their decisive final group matches on Saturday.
Although the draw benefited Senegal, Iran remains in contention to reach the World Cup knockout stage for the first time in their history.
Latest Stories
- Second petition asks court to block mandatory inspections for private vehicles under new NTSA rules
- Teachers urge Ruto to confirm Evaleen Mitei as TSC CEO, citing reforms achieved during her tenure
- Activists demand accountability over alleged police brutality and enforced disappearances
- KRA begins investigations as 3,600 litres of suspected uncustomed cooking oil seized in Marsabit
The Asians finished with three points after drawing all three of their group matches and must now wait for results in the remaining groups to determine whether they finish among the best third-placed teams.
Iran endured a dramatic evening in Seattle. Egypt struck first in the fifth minute through Mahmoud Saber, but Iran responded after Mehdi Taremi saw his penalty saved, with Ramin Rezaeian smashing home the rebound from a tight angle.
Late drama almost changed everything as Shoja Khalilzadeh had a goal ruled out after a lengthy VAR review for offside, while Saeid Ezatolahi headed against the crossbar in the seventh minute of stoppage time. Earlier, Taremi had also struck the woodwork, although the referee had already blown for a foul.
The result ensured Egypt progressed as Group G runners-up after Belgium topped the standings with a victory over New Zealand.
Iran’s qualification hopes now depend on Saturday’s results. They will progress if any one of the following happens: Croatia lose to Ghana, DR Congo fails to beat Uzbekistan, provided Uzbekistan do not win by seven goals or more, or either Algeria or Austria wins their Group J meeting.
Belgium roar back to life
Belgium thrashed New Zealand 5-1. (Photo: FIFA)
Belgium produced their best performance of the tournament when they thrashed New Zealand 5-1 in Vancouver to secure top spot in Group G on goal difference.
Leandro Trossard scored twice as the Red Devils bounced back from two underwhelming displays to dominate from start to finish.
Kevin De Bruyne added a superb long-range strike before substitute Romelu Lukaku marked his introduction with a goal just 56 seconds after coming off the bench, underlining the old football saying about a prolific striker needing only one chance.
Alexis Saelemaekers completed the scoring in stoppage time after Elijah Just had briefly pulled one back for New Zealand.
Belgium’s victory, coupled with Egypt’s draw against Iran, saw them finish as group winners and, as things stand, set up a Round of 32 meeting with South Korea.
Africa’s presence in the knockout rounds continues to grow, with seven nations already through and the possibility of that number rising to nine if Algeria and DR Congo complete the job in their final group fixtures.
The continent has already witnessed several historic breakthroughs, including Cape Verde reaching the knockout stages on their World Cup debut, South Africa qualifying for the first time, and the Ivory Coast advancing beyond the group stage for the first time in their history.
Should Algeria and DR Congo also qualify, it would represent one of Africa’s greatest collective performances at a FIFA World Cup.
Round of 32 picture taking shape
Nine Round of 32 ties have already been confirmed:
Other Topics To Read
Several other pairings are provisionally set, including Portugal against Ghana, England against Senegal, Belgium against South Korea, Mexico against Ecuador, Switzerland against Iran, Spain against Austria and Colombia against Croatia, though those fixtures remain subject to the outcome of the remaining group-stage matches on Saturday.
Top Stories Today
- Teachers urge Ruto to confirm Evaleen Mitei as TSC CEO
- Second court petition seeks to block new NTSA vehicle inspection rules
- Kenya pushes for regional AI rules under COMESA framework
- Civil society demands probe into alleged abductions and police brutality
- Police seize 3,600 litres of suspected smuggled cooking oil in Marsabit
- State accused of unconstitutional bid to sell Safaricom shares
`;
}
return “;
}
function commentActionsMarkup(comment, canComment) {
const likeLabel = comment.liked_by_me ? ‘Liked’ : ‘Like’;
const likeCount = Number(comment.like_count || 0) > 0
? “
: ”;
const likeButton = canComment && comment.status === ‘approved’
? “
: “;
const replyButton = canComment && comment.status === ‘approved’
? “
: ”;
return `
`;
}
function commentMarkup(comment, canComment, isReply = false) {
const pendingBadge = comment.status && comment.status !== ‘approved’
? “
: ”;
const edited = comment.is_edited
? “
: ”;
const repliesHtml = Array.isArray(comment.replies) && comment.replies.length
? `
`
: “;
return `
`;
}
function replyFormMarkup(commentId) {
return `
`;
}
function setNotice(widget, message, type = ‘info’) {
const notice = widget.querySelector(‘[data-role=”notice”]’);
if (!notice) return;
if (!message) {
notice.hidden = true;
notice.textContent = ”;
notice.classList.remove(‘is-error’);
return;
}
notice.hidden = false;
notice.textContent = message;
notice.classList.toggle(‘is-error’, type === ‘error’);
}
function setCount(widget, total) {
const count = widget.querySelector(‘[data-role=”count”]’);
if (!count) return;
const num = Number(total || 0);
count.textContent = num === 1 ? ‘1 comment’ : `${num} comments`;
}
function openReplyBox(widget, commentId) {
widget.querySelectorAll(‘[data-role=”reply-box”]’).forEach(box => {
box.hidden = true;
box.innerHTML = ”;
});
const targetItem = widget.querySelector(`.ev-comments__item[data-comment-id=”${commentId}”]`);
if (!targetItem) return;
const replyBox = targetItem.querySelector(‘[data-role=”reply-box”]’);
if (!replyBox) return;
replyBox.hidden = false;
replyBox.innerHTML = replyFormMarkup(commentId);
const textarea = replyBox.querySelector(‘textarea’);
if (textarea) textarea.focus();
}
function closeReplyBox(container) {
if (!container) return;
container.hidden = true;
container.innerHTML = ”;
}
async function initCommentsWidget(widget) {
const state = {
articleId: Number(widget.dataset.articleId),
loadUrl: widget.dataset.loadUrl,
storeUrl: widget.dataset.storeUrl,
commentsBaseUrl: widget.dataset.commentsBaseUrl,
canComment: widget.dataset.canComment === ‘1’,
page: 1,
perPage: 10,
sort: ‘newest’,
total: 0,
hasMore: false,
busy: false
};
const list = widget.querySelector(‘[data-role=”list”]’);
const loading = widget.querySelector(‘[data-role=”loading”]’);
const empty = widget.querySelector(‘[data-role=”empty”]’);
const loadMoreBtn = widget.querySelector(‘[data-role=”load-more”]’);
const sortSelect = widget.querySelector(‘[data-role=”sort”]’);
const composerForm = widget.querySelector(‘[data-role=”composer-form”]’);
async function loadComments(reset = true) {
if (state.busy) return;
state.busy = true;
setNotice(widget, ”);
loading.hidden = false;
if (reset) {
state.page = 1;
list.innerHTML = ”;
empty.hidden = true;
}
try {
const url = new URL(state.loadUrl, window.location.origin);
url.searchParams.set(‘page’, state.page);
url.searchParams.set(‘per_page’, state.perPage);
url.searchParams.set(‘sort’, state.sort);
const response = await requestJson(url.toString(), {
method: ‘GET’,
headers: {
‘Accept’: ‘application/json’,
‘X-Requested-With’: ‘XMLHttpRequest’
}
});
const items = Array.isArray(response.data) ? response.data : [];
const meta = response.meta || {};
state.total = Number(meta.total || 0);
state.hasMore = !!meta.has_more;
setCount(widget, state.total);
if (reset) {
list.innerHTML = ”;
}
if (!items.length && reset) {
empty.hidden = false;
} else {
empty.hidden = true;
list.insertAdjacentHTML(
‘beforeend’,
items.map(item => commentMarkup(item, state.canComment, false)).join(”)
);
}
loadMoreBtn.hidden = !state.hasMore;
} catch (error) {
if (!list.children.length) {
empty.hidden = false;
empty.textContent = ‘Unable to load comments right now.’;
}
setNotice(widget, error.message || ‘Unable to load comments.’, ‘error’);
} finally {
loading.hidden = true;
state.busy = false;
}
}
async function submitTopLevelComment(form) {
const textarea = form.querySelector(‘textarea[name=”content”]’);
const button = form.querySelector(‘[data-role=”submit-comment”]’);
if (!textarea) return;
const content = textarea.value.trim();
if (!content) return;
const originalText = button ? button.textContent : ”;
try {
if (button) {
button.disabled = true;
button.textContent = ‘Posting…’;
}
const response = await requestJson(state.storeUrl, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({
article_id: state.articleId,
content: content,
source_url: window.location.href
})
});
textarea.value = ”;
if (response?.data) {
list.insertAdjacentHTML(
‘afterbegin’,
commentMarkup(response.data, state.canComment, false)
);
empty.hidden = true;
if ((response.data.status || ”) === ‘approved’) {
state.total += 1;
setCount(widget, state.total);
}
}
setNotice(widget, response.message || ‘Comment posted successfully.’);
} catch (error) {
setNotice(widget, error.message || ‘Unable to post comment.’, ‘error’);
} finally {
if (button) {
button.disabled = false;
button.textContent = originalText || ‘Post comment’;
}
}
}
async function submitReply(form) {
const commentId = Number(form.dataset.commentId || 0);
const textarea = form.querySelector(‘textarea[name=”content”]’);
const button = form.querySelector(‘.ev-comments__reply-submit’);
if (!commentId || !textarea) return;
const content = textarea.value.trim();
if (!content) return;
const originalText = button ? button.textContent : ”;
try {
if (button) {
button.disabled = true;
button.textContent = ‘Posting…’;
}
const response = await requestJson(`${state.commentsBaseUrl}/${commentId}/reply`, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({
article_id: state.articleId,
content: content,
source_url: window.location.href
})
});
if (response?.data) {
const parentItem = widget.querySelector(`.ev-comments__item[data-comment-id=”${commentId}”]`);
if (parentItem) {
const repliesWrap = parentItem.querySelector(‘.ev-comments__replies’);
if (repliesWrap) {
repliesWrap.insertAdjacentHTML(
‘beforeend’,
commentMarkup(response.data, state.canComment, true)
);
}
}
}
closeReplyBox(form.closest(‘[data-role=”reply-box”]’));
setNotice(widget, response.message || ‘Reply posted successfully.’);
} catch (error) {
setNotice(widget, error.message || ‘Unable to post reply.’, ‘error’);
} finally {
if (button) {
button.disabled = false;
button.textContent = originalText || ‘Post reply’;
}
}
}
async function toggleLike(button) {
const commentId = Number(button.dataset.commentId || 0);
if (!commentId) return;
const originalHtml = button.innerHTML;
try {
button.disabled = true;
button.innerHTML = ‘Working…’;
const response = await requestJson(`${state.commentsBaseUrl}/${commentId}/like`, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({})
});
const liked = !!response?.data?.liked;
const likeCount = Number(response?.data?.like_count || 0);
button.classList.toggle(‘is-liked’, liked);
button.innerHTML = `${liked ? ‘Liked’ : ‘Like’} ${likeCount > 0 ? “ : ”}`;
} catch (error) {
button.innerHTML = originalHtml;
setNotice(widget, error.message || ‘Unable to update like.’, ‘error’);
} finally {
button.disabled = false;
}
}
if (composerForm) {
composerForm.addEventListener(‘submit’, function (e) {
e.preventDefault();
submitTopLevelComment(composerForm);
});
}
if (sortSelect) {
sortSelect.addEventListener(‘change’, function () {
state.sort = this.value || ‘newest’;
loadComments(true);
});
}
if (loadMoreBtn) {
loadMoreBtn.addEventListener(‘click’, function () {
if (state.busy || !state.hasMore) return;
state.page += 1;
loadComments(false);
});
}
widget.addEventListener(‘click’, function (e) {
const likeBtn = e.target.closest(‘[data-action=”toggle-like”]’);
if (likeBtn) {
e.preventDefault();
toggleLike(likeBtn);
return;
}
const replyBtn = e.target.closest(‘[data-action=”toggle-reply”]’);
if (replyBtn) {
e.preventDefault();
openReplyBox(widget, Number(replyBtn.dataset.commentId || 0));
return;
}
const cancelReplyBtn = e.target.closest(‘[data-action=”cancel-reply”]’);
if (cancelReplyBtn) {
e.preventDefault();
closeReplyBox(cancelReplyBtn.closest(‘[data-role=”reply-box”]’));
}
});
widget.addEventListener(‘submit’, function (e) {
const replyForm = e.target.closest(‘.ev-comments__reply-form’);
if (replyForm) {
e.preventDefault();
submitReply(replyForm);
}
});
loadComments(true);
}
document.addEventListener(‘DOMContentLoaded’, function () {
document.querySelectorAll(‘.ev-comments’).forEach(initCommentsWidget);
});
})();
Trending
Why teachers will be required to undergo new five-year training to renew licences
Somalia’s Deputy Prime Minister breaks silence after Kenya deportation, denies arming militias
KU student denies charges of unlawful entry, Sh41 million vandalism at parliament during Gen Z Protests
Government allocates Sh9.3 billion to deploy and train 6,784 healthcare interns in UHC push
Kenya pushes for common AI rules across COMESA to boost trade and cybersecurity
NTSA clarifies rollout of new inspection rules, says no immediate penalties for motorists
Relief for Nairobi motorists as Ruto opens Sh3.58 billion Ngong Road–Naivasha Road flyover to ease city traffic
How Zablon Ekwam’s Kenyan bracelet became Botswana sprinter Collen Kebinatshipi’s lucky charm
Hope for NMG Uganda as Gen Muhoozi begins talks to reopen Daily Monitor, NTV Uganda
Activists demand accountability over alleged police brutality and enforced disappearances
