diff --git a/packages/block-library/src/embed/transforms.js b/packages/block-library/src/embed/transforms.js index e1b2f256e2d56d..37c92fc3d1c264 100644 --- a/packages/block-library/src/embed/transforms.js +++ b/packages/block-library/src/embed/transforms.js @@ -2,6 +2,7 @@ * WordPress dependencies */ import { createBlock } from '@wordpress/blocks'; +import { isURL, getFilename } from '@wordpress/url'; /** * Internal dependencies @@ -22,10 +23,24 @@ const transforms = { from: [ { type: 'raw', - isMatch: ( node ) => - node.nodeName === 'P' && - /^\s*(https?:\/\/\S+)\s*$/i.test( node.textContent ) && - node.textContent?.match( /https/gi )?.length === 1, + isMatch: ( node ) => { + if ( node.nodeName !== 'P' ) { + return false; + } + const trimmed = node.textContent.trim(); + if ( + ! isURL( trimmed ) || + ! /^https:\/\//i.test( trimmed ) || + trimmed.match( /https:\/\//gi )?.length !== 1 + ) { + return false; + } + // Reject URLs whose filename ends in a file extension, + // except common page extensions used by permalinks. + return ! /\.(?!(html?|php)$)[a-z0-9]+$/i.test( + getFilename( trimmed ) || '' + ); + }, transform: ( node ) => { const url = rewriteXToTwitter( node.textContent.trim() ); return createBlock( EMBED_BLOCK, {