urlpattern هو واجهة برمجة تطبيقات ويب جديدة لمطابقة عناوين URL. المقصود أن يوفر كلاهما واجهة برمجة تطبيقات مريحة لمطوري الويب وأن يكون قابلاً للاستخدام في واجهات برمجة التطبيقات الأخرى على الويب التي تحتاج إلى مطابقة عناوين URL ؛ على سبيل المثال عمال الخدمة. يناقش الشرح حالات الاستخدام المحفزة.
هذا هو polyfill ل API urlpattern بحيث تتوفر الميزة في المتصفحات التي لا تدعمها أصليا. يمر هذا السلطات بنفس مجموعة اختبار منصة الويب.
يعمل polyfill في المتصفحات (وحدة ESM) وفي node.js إما عن طريق الاستيراد (وحدة ESM) أو عبر متطلبات (وحدة CJS).
لن يتم تحميل polyfill إلا إذا لم يكن urlpattern موجودًا بالفعل على الكائن العالمي ، وفي هذه الحالة سيضيفه إلى الكائن العالمي.
// Conditional ESM module loading (Node.js and browser)
// @ts-ignore: Property 'UrlPattern' does not exist
if ( ! globalThis . URLPattern ) {
await import ( "urlpattern-polyfill" ) ;
}
/**
* The above is the recommended way to load the ESM module, as it only
* loads it on demand, thus when not natively supported by the runtime or
* already polyfilled.
*/
import "urlpattern-polyfill" ;
/**
* In case you want to replace an existing implementation with the polyfill:
*/
import { URLPattern } from "urlpattern-polyfill" ;
globalThis . URLPattern = URLPattern ملحوظة:
// @ts-ignore: Property 'UrlPattern' does not existفي بعض البيئات لأنه قبل تحميل polyfill قد لا يكون متاحًا ، والتحقق من الميزة في IF يعطي خطأ typescript. الفكرة كلها هي أنه يتم تحميله عندما لا يكون هناك.
// Conditional CJS module loading (Node.js)
if ( ! globalThis . URLPattern ) {
require ( "urlpattern-polyfill" ) ;
}
/**
* The above is the recommended way to load the CommonJs module, as it only
* loads it on demand, thus when not natively supported by the runtime or
* already polyfilled.
*/
require ( "urlpattern-polyfill" ) ;
/**
* In case you want to replace an existing implementation with the polyfill:
*/
const { URLPattern } = require ( "urlpattern-polyfill" ) ; ;
globalThis . URLPattern = URLPattern ملحوظة:
بغض النظر عن كيفية تحميل polyfill ، عندما لا يكون هناك تطبيق في بيئتك ، فإنه سيضيفه دائمًا إلى الكائن العالمي.
let p = new URLPattern ( { pathname : '/foo/:name' } ) ;
let r = p . exec ( 'https://example.com/foo/bar' ) ;
console . log ( r . pathname . input ) ; // "/foo/bar"
console . log ( r . pathname . groups . name ) ; // "bar"
let r2 = p . exec ( { pathname : '/foo/baz' } ) ;
console . log ( r2 . pathname . groups . name ) ; // "baz" // Match same-origin jpg or png URLs.
// Note: This uses a named group to make it easier to access
// the result later.
const p = new URLPattern ( {
pathname : '/*.:filetype(jpg|png)' ,
baseURL : self . location
} ) ;
for ( let url in url_list ) {
const r = p . exec ( url ) ;
// skip non-matches
if ( ! r ) {
continue ;
}
if ( r . pathname . groups [ 'filetype' ] === 'jpg' ) {
// process jpg
} else if ( r . pathname . groups [ 'filetype' ] === 'png' ) {
// process png
}
}يمكن جعل النمط في هذه الحالة أكثر بساطة دون التحقق من الأصل عن طريق ترك baseurl.
// Match any URL ending with 'jpg' or 'png'.
const p = new URLPattern ( { pathname : '/*.:filetype(jpg|png)' } ) ; نحن نخطط أيضًا لدعم "نموذج قصير" لتهيئة كائنات urlpattern. ويدعم هذا من قبل polyfill ولكن ليس بعد تنفيذ الكروم.
على سبيل المثال:
const p = new URLPattern ( "https://*.example.com/foo/*" ) ;أو:
const p = new URLPattern ( "foo/*" , self . location ) ;تم العثور على نظرة عامة على API مع التعليقات التوضيحية نوع TypeScript. يمكن العثور على IDL على شبكة الإنترنت المتصفح المرتبط هنا.
type URLPatternInput = URLPatternInit | string ;
class URLPattern {
constructor ( init ?: URLPatternInput , baseURL ?: string ) ;
test ( input ?: URLPatternInput , baseURL ?: string ) : boolean ;
exec ( input ?: URLPatternInput , baseURL ?: string ) : URLPatternResult | null ;
readonly protocol : string ;
readonly username : string ;
readonly password : string ;
readonly hostname : string ;
readonly port : string ;
readonly pathname : string ;
readonly search : string ;
readonly hash : string ;
}
interface URLPatternInit {
baseURL ?: string ;
username ?: string ;
password ?: string ;
protocol ?: string ;
hostname ?: string ;
port ?: string ;
pathname ?: string ;
search ?: string ;
hash ?: string ;
}
interface URLPatternResult {
inputs : [ URLPatternInput ] ;
protocol : URLPatternComponentResult ;
username : URLPatternComponentResult ;
password : URLPatternComponentResult ;
hostname : URLPatternComponentResult ;
port : URLPatternComponentResult ;
pathname : URLPatternComponentResult ;
search : URLPatternComponentResult ;
hash : URLPatternComponentResult ;
}
interface URLPatternComponentResult {
input : string ;
groups : {
[ key : string ] : string | undefined ;
} ;
}يعتمد بناء الجملة النمط هنا على ما يتم استخدامه في مكتبة المسار الشهير إلى regexp.
"/" .":" ثم اسم. على سبيل المثال ، "/:foo/:bar" لديه مجموعتان اسمهان."/:foo(.*)" سوف يتجاوز الافتراضي للمطابقة مع المقسم التالي."?" أو "*" أو "+" وظائف كما تفعل في التعبيرات العادية. عندما تكون المجموعة اختيارية أو متكررة وتسبقها مقسم ، يكون المقسم أيضًا اختياريًا أو متكررًا. على سبيل المثال ، "/foo/:bar?" سوف يتطابق مع "/foo" ، "/foo/" ، أو "/foo/baz" . الهروب من المقسم سيجعله مطلوبًا بدلاً من ذلك."(.*)" (ما يسمى المجموعات التي لم يكشف عن اسمها).حاليًا نخطط للحصول على هذه الاختلافات المعروفة مع مسار إلى regexp:
تحتوي عناوين URL على شكل قانوني يعتمد على ASCII ، مما يعني أن أسماء النطاق الدولية (أسماء المضيفات) لها أيضًا تمثيل قائم على ASCII ، وأن المكونات الأخرى مثل hash search وتسليم pathname يتم تشفيرها باستخدام الترميز المئوي.
حاليا URLPattern لا تؤدي أي ترميز أو تطبيع الأنماط. لذلك يحتاج المطور إلى تشفير UNICODE أحرف UNICODE قبل نقل النمط إلى المُنشئ. وبالمثل ، لا يفعل المنشئ أشياء مثل تسطيح أسماء المسارات مثل /foo/../bar to /bar. حاليًا يجب كتابة النمط لاستهداف إخراج URL الكنسي يدويًا.
ومع ذلك ، فإنه يؤدي هذه العمليات test() وإدخال exec() .
يمكن بسهولة إجراء مكونات الترميز يدويًا ، ولكن لا ترميز بناء جملة النمط:
encodeURIComponent ( "?q=æøå" )
// "%3Fq%3D%C3%A6%C3%B8%C3%A5" new URL ( "https://ølerlækkernårdetermit.dk" ) . hostname
// "xn--lerlkkernrdetermit-dubo78a.dk"إذا كان لديك معلومات حول مشكلة أمان أو ضعف مع مشروع مفتوح المصدر الذي تم صيانته على https://github.com/intel ، فيرجى إرسال رسالة بريد إلكتروني إلى [email protected]. تشفير المعلومات الحساسة باستخدام مفتاح PGP Public الخاص بنا. للمشكلات المتعلقة بمنتجات Intel ، يرجى زيارة https://security-center.intel.com.