اذهب إلى المحتوى

Mustafa Suleiman

الأعضاء
  • المساهمات

    12074
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    340

كل منشورات العضو Mustafa Suleiman

  1. من يمكنه مساعدتك في هذا الشأن هو مركز المساعدة ، عليك إخبارهم بما تريد وإنتظار الرد.
  2. إذا أردت تجاهل التشكيل بشكل كامل، تتوفر مكتبات لتحويل الكلمات إلى نص بدون تشكيل، مثل: Arabic-Stemmers stemmer وبالنسبة لحل للبحث بشكل مقارب بدون التجاهل الكامل للتشكيل، فعليك استخدام ميزة الترتيب حسب الشبهية (Fuzzy Search) مع بعض التعديلات على الكود، وتتوفر مكتبة مثل "scout" مع Elasticsearch لتحقيق ذلك. وهناك مكتبة جاهزة توفر لك ذلك عليك قراءة المستند الخاص بها: https://github.com/matchish/laravel-scout-elasticsearch
  3. عليك أولاً تثبيت Laravel Sanctum وتكوينه لتوفير ميزات المصادقة، بتشغيل الأوامر: composer require laravel/sanctum php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider" php artisan migrate ثم تكوين ملف config/cors.php للسماح للمتصفح بتبادل الموارد عبر المواقع CORS (Cross-Origin Resource Sharing)، بتنفيذ التالي لنشر ملفات التكوين: composer require fruitcake/laravel-cors php artisan vendor:publish --tag="cors" بعد ذلك تأكد من أن Jetstream يستخدم Sanctum كـ API حسب الحاجة، وقم بفحص ملف config/jetstream.php وتحقق من أن خيار stack يتم تعيينه إلى livewire أو inertia. نأتي الآن لخطوة تكوين حماية Sanctum Middleware، ففي ملف app/Http/Kernel.php، يجب أن يكون EnsureFrontendRequestsAreStateful middleware موجود في مجموعة web middleware. وفي ملف config/sanctum.php، عليك تكوين stateful لـ sanctum بحيث تكون هناك علامة تحقق للمتصفح. والآن قم بإنشاء نقاط النهاية (controllers) الخاصة بك للعمليات التي تحتاج إليها، وضع middleware auth:sanctum في النقاط التي تتطلب مصادقة المستخدم. مثال على ملف routes/api.php: use App\Http\Controllers\Api\PostController; Route::middleware('auth:sanctum')->group(function () { Route::get('/posts', [PostController::class, 'index']); // يمكنك إضافة طرق إضافية هنا }); وكمثال سنقوم بإنشاء app/Http/Controllers/Api/PostController.php: <?php namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; use App\Models\Post; use Illuminate\Http\Request; class PostController extends Controller { public function index() { $posts = Post::all(); return response()->json($posts); } // يمكنك إضافة المزيد من الوظائف مثل store وupdate وdelete حسب الحاجة. } في مشروع React.js، تستطيع استخدام fetch أو Axios لاستدعاء نقاط النهاية API: import React, { useEffect, useState } from 'react'; function App() { const [posts, setPosts] = useState([]); useEffect(() => { fetch('/api/posts') .then(response => response.json()) .then(data => setPosts(data)); }, []); return ( <div> <h1>Posts</h1> <ul> {posts.map(post => ( <li key={post.id}>{post.title}</li> ))} </ul> </div> ); } export default App;
  4. هجمات CSRF لا تعتمد على بيانات الاعتماد المخزنة في المتصفح أو الجهاز، بل تعتمد على حقيقة أن المستخدم قد تم تسجيل الدخول بالفعل إلى موقع الويب، وعندما يقوم المستخدم بتسجيل الدخول إلى موقع ويب، يقوم الموقع بتعيين ملف تعريف ارتباط يسمى ملف تعريف ارتباط الجلسة، ويحتوي ملف تعريف ارتباط الجلسة على معرف فريد يربط المستخدم بالجلسة الحالية. أي تعتمد على جلب عمليات غير مصرح بها من المستخدم عبر تنفيذ أوامر داخل موقع ويب حيث قد تكون المستخدم قد قام بتسجيل الدخول، والهجمات لا تستند إلى بيانات الاعتماد نفسها، بل تستفيد من جلب الجلسة (Session) النشطة في المتصفح. وبالتبعية عندما يقوم المهاجم بتنفيذ هجوم CSRF، فإنه يقوم بإرسال طلب ويب إلى موقع الويب نيابة عن الضحية، ويتضمن الطلب ملف تعريف ارتباط الجلسة للضحية، وعند تلقى موقع الويب الطلب، فإنه يتحقق من ملف تعريف ارتباط الجلسة ويسمح للطلب بالمضي قدمًا. وأحيانًا تُخزن بيانات الاعتماد داخل الكوكيز، وإن كان الأمر كذلك، فقد يتمكن المهاجم من استخدام هجوم CSRF للحصول على بيانات اعتماد الضحية، ولكن ذلك النوع من الهجمات أقل شيوعًا من الهجمات التي تعتمد على ملف تعريف ارتباط الجلسة. وبيانات الاعتماد (مثل اسم المستخدم وكلمة المرور) تُرسَل عادةً في كل طلب (request)، سواء كان ذلك عبر الكوكيز أو الهيدرات (headers) الأخرى، والهجمات CSRF تستفيد من عدم فصل الجلسات بشكل صحيح. نعم ولا في نفس الوقت، حيث يجب على الموقع الويب تنفيذ تدابير أمان مناسبة لحماية ضد هجمات CSRF، وذلك يتضمن استخدام رموز عشوائية موقعة (CSRF tokens) في الطلبات للتحقق من أن الطلب يأتي من المستخدم الحقيقي وليس من مهاجم. ولكن عندما تقوم بتسجيل الدخول إلى موقع ويب، يتم إنشاء ملف تعريف ارتباط جلسة جديد، وفي حال لم تقم بتسجيل الخروج من الموقع، فسيظل ملف تعريف ارتباط الجلسة هذا صالحًا. هنا يستطيع المهاجم استخدام ملف تعريف ارتباط الجلسة لتنفيذ هجوم CSRF، مثل إنشاء رابط ويب يحتوي على رمز ضار، وعند نقر المستخدم على الرابط، يتم إرسال طلب ويب ضار إلى موقع الويب نيابة عن المستخدم. لذا، إن استطعت، يُنصح بتسجيل الخروج بعد الانتهاء من الجلسة لضمان أمان الجلسة، وكذلك تحديث وتعزيز إجراءات الأمان على الموقع لتقليل مخاطر هجمات CSRF، والإلتزام بالتالي: سجل الخروج من المواقع التي لا تستخدمها بانتظام. استخدم أدوات الأمان التي تساعد على حماية حساباتك من الهجمات الإلكترونية. كن حذرًا من الروابط التي تتلقاها في البريد الإلكتروني أو من مواقع الويب التي لا تثق بها. إذا كنت تشك في أنك قد تعرضت لهجوم CSRF، فقم بتغيير كلمات المرور الخاصة بك على الفور.
  5. الخريطة ستكون كالآتي: بداية: تبدأ التنفيذ هنا. X=1: نقوم بتهيئة المتغير X ليكون 1. حاصل الضرب: نبدأ بقيمة متغير (ضرب) تكون 1. ضرب = ضرب * X: نقوم بضرب القيمة الحالية للمتغير (ضرب) في X. X < 10: نتحقق من أن قيمة X لا تزال أقل من 10. X = X + 2: نزيد قيمة X بمقدار 2 (للحصول على الأعداد الفردية). انهاء: عندما تكون قيمة X أكبر من 10، يتم إنهاء العملية. عليك رسمها بالمنطق السابق.
  6. أرجو منك التعليق أسفل الدرس لمساعدتك بشكل أفضل. تستطيع ذلك، حيث نستخدم عامل الجمع + لتحويل القيم إلى أعداد بدلاً من استخدام الدالة Number، ويُطلق على تلك العملية اسم "Unary Plus"، وذلك لأن العامل + يُستخدم بمفرده لتحويل القيم إلى أعداد. وتستطيع الإعتماد على Unary Plus مع أي نوع من القيم، ولكن النتيجة ستكون NaN إذا كانت القيمة لا تمثل رقمًا صالحًا. صحيح، لكن في الكود الخاص بجافا أنت قمت بكتابة المتغير ولم تضعه بداخل علامتي إقتباس. أما في جافاسكريبت فعلت ذلك، ولا نستطيع كتابة متغير داخل نص أي علامتي إقتباس، لكن هناك طريقة لفعل ذلك من خلال ميزة قالب النص Template literal ولكن نكتب `` بدلاً من ' ' لاحظ علامتي إقتباس مائلتين وعليك قراءة الشرح التالي لتفهم الأمر:
  7. يجب تشغيل مترجم بايثون في منفذ الأوامر من خلال كتابة python او py ثم اضغطي على Enter، والآن تستطيعي كتابة أكواد بايثون.
  8. الكود بحاجة إلى إعادة كتابة بالكامل لهيكلة الصفحة بشكل جيد، ومبدأيًا سيكون شكل الكود كالتالي: <!DOCTYPE html> <html lang="en"> <head runat="server"> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Click to Chic: Elevate Your Style with Online Shopping</title> <link rel="stylesheet" href="Mystyle.css"> <style> body { background: #f8f8f8; margin: 0; font-size: 16px; line-height: 1.6; font-family: 'Arial', sans-serif; } header { background: #3498db; color: #fff; padding: 1rem; display: flex; justify-content: space-between; align-items: center; } #logo img { width: 100px; height: auto; } nav { display: flex; align-items: center; } nav ul { list-style: none; display: flex; margin: 0; } nav li { margin-right: 20px; } nav a { text-decoration: none; color: #fff; font-weight: bold; font-size: 1.1rem; } main { padding: 2rem; box-sizing: border-box; } #footer { background: #3498db; color: #fff; padding: 2rem; display: flex; justify-content: space-between; align-items: center; } #footer .social-links { list-style: none; display: flex; margin: 0; padding: 0; } #footer .social-links li { margin-right: 10px; } #footer .social-links img { width: 40px; height: auto; } #footer-content { flex-grow: 1; margin-left: 2rem; } #bot-left { font-size: 0.8rem; } </style> </head> <body> <header> <div id="logo"> <img src="https://placehold.co/100x100" alt="Logo"> </div> <nav> <ul> <li><a href="home.aspx">Home</a></li> <li><a href="Women.aspx">Women Clothes</a></li> <li><a href="Men.aspx">Men Clothes</a></li> <li><a href="About Us.aspx">About Us</a></li> <li><a href="Contact Us.aspx">Contact Us</a></li> </ul> </nav> <asp:LoginView ID="LoginView1" runat="server"> <AnonymousTemplate> Welcom!,&nbsp; <a href="Register.aspx">Register</a> &nbsp;|&nbsp; <a href="Login.aspx" style="text-align: right">Login</a> </AnonymousTemplate> <LoggedInTemplate> <asp:LoginName ID="Log_name" runat="server" FormatString="Hi {0}!" /> <asp:LoginStatus ID="Log_stat" runat="server" LogoutText="Logout" LogoutPageUrl="~/default.aspx" LogoutAction="Redirect" LoginText="Login" OnLoggingOut="Log_stat_LoggingOut" /> </LoggedInTemplate> </asp:LoginView> </header> <main> <!-- Your main content goes here --> </main> <footer id="footer"> <div id="footer-sidebar"> <ul class="social-links"> <li> <a href="https://www.whatsapp.com/" target="_blank"> <img src="https://placehold.co/40x40" alt="WhatsApp"> </a> </li> <li> <a href="https://www.twitter.com/" target="_blank"> <img src="https://placehold.co/40x40" alt="Twitter"> </a> </li> <li> <a href="https://www.instagram.com/" target="_blank"> <img src="https://placehold.co/40x40" alt="Instagram"> </a> </li> <li> <a href="https://www.facebook.com/" target="_blank"> <img src="https://placehold.co/40x40" alt="Facebook"> </a> </li> </ul> </div> <div id="footer-content"> <h1>Online Shopping</h1> <p>Providing high-quality garments, shoes, and watches at a low price</p> 2023 created by ALNABHANI </div> </footer> </body> </html>
  9. استخدم الدالة pd.concat، ويجب أن تحدد المحور الذي تريد الدمج عليه، سواء كان ذلك على محور الأعمدة (axis=1) أو على محور الصفوف (axis=0)، وأنت تريد الدمج على محور الأعمدة: import pandas as pd # الأعمدة المستخدمة من selected_rows columns_selected_rows = [0, 2, 1, 3, 4, 5, 6] # الأعمدة المستخدمة من selected_rows2 columns_selected_rows2 = [3, 4, 5, 6] # قراءة البيانات من ملفات Excel df = pd.read_excel("2023.xlsx", header=None, usecols=columns_selected_rows) df2 = pd.read_excel("AAA.xlsx", header=None, usecols=columns_selected_rows2) # اختيار الصفوف المطلوبة selected_rows = df.iloc[8::2].reset_index(drop=True) selected_rows2 = df2.iloc[9::2].reset_index(drop=True) # دمج الجدولين على محور الأعمدة result_df = pd.concat([selected_rows, selected_rows2], axis=1) # طباعة النتيجة print(result_df) بحيث يتم دمج selected_rows و selected_rows2 على محور الأعمدة باستخدام pd.concat، ثم طباعة DataFrame الناتج result_df. إذا كنت ترغب في تغيير ترتيب الأعمدة، فتتوفر دالة set_axis().
  10. المشكلة تكمن في كيفية استخدام reset_index، وتحديداً في الخطوتين: selected_column_1.reset_index(drop=True, inplace=True) selected_column_2.reset_index(drop=True, inplace=True) فعند استخدام inplace=True، يؤدي إلى تعديل DataFrame المحدد مباشرة بدون إعادة إعادة الجدول، وبالتالي يجب عليك تعديل الكود بحيث يتم حذف استخدام inplace=True. الأمر الذي يجعل الإطارين selected_column_1 و selected_column_2 تعديل بنية البيانات الأصلية: selected_column_1.reset_index(drop=True) selected_column_2.reset_index(drop=True) لذلك، يجب عليك تحديث الجزء النهائي من الكود ليصبح كالتالي: import pandas as pd df = pd.read_excel("AAA.xlsx", header=None) selected_column_1 = df.iloc[8::2, [0,1,2,3,4,5,6]] selected_column_1.reset_index(drop=True) selected_column_2 = df.iloc[9::2, [2,7,8,9,10]] selected_column_2.reset_index(drop=True) A = pd.DataFrame(selected_column_1, columns=['العمر','رقم الهاتف','إسم العائة','الإسم الأول']) B = pd.DataFrame(selected_column_2, columns=['نتيجة الدور','أعمال السنة','النهائي','المجموع','التقدير']) ومن المفترض أن يظهر DataFrame A كما هو متوقع. في حال لم تكن تلك المشكلة لديك، حاول تحديد الأعمدة التي تريدها في DataFrame الجديد، أو تستطيع استخدام طريقة loc لتحديد الصفوف والصفوف التي تريدها، كالتالي: A = pd.DataFrame(selected_column_1, columns=['العمر','رقم الهاتف','إسم العائة','الإسم الأول']) أو استخدام الطريقة التالية لتحديد الصفوف والصفوف التي تريدها: A = pd.DataFrame(selected_column_1.iloc[0:10, [0,1,2,3,4,5,6]], columns=['العمر','رقم الهاتف','إسم العائة','الإسم الأول'])
  11. نستخدم الاتصال الآمن (HTTPS) بدلاً من الاتصال غير الآمن (HTTP) لضمان أمان نقل البيانات بين المستخدم والخادم، حيث أن HTTPS يوفر تشفير الاتصال، مما يعني أن البيانات التي يتم نقلها بين المتصفح والخادم تكون مشفرة وأكثر أمانًا من الهجمات مثل الاعتراض على الاتصال. وبالتالي عند استخدام تسجيل الدخول بواسطة فيسبوك، يوجد سياسة تستدعي استخدام HTTPS للحفاظ على أمان البيانات الحساسة التي يتم تبادلها، أيضًا الطلبات الصادرة من الصفحات التي تستخدم تسجيل الدخول بواسطة فيسبوك ملزمة بالاتصال عبر HTTPS.
  12. المطلوب هو التالي: 1- عرض صندوق الوارد الخاص بمستخدم (أحد أعضاء المجموعة)، ويجب أن يشمل ذلك كل من رسائل البريد الإلكتروني المباشرة ورسائل البريد الإلكتروني إلى مجموعاته. ولعرض صندوق الوارد الخاص بمستخدم، ستحتاج إلى استعلام جدول Email وتصفية النتائج حسب عمود ReceiverID لتطابق معرف المستخدم، وستحتاج أيضًا إلى الانضمام إلى جدول UserGroup لتحديد المجموعات التي يكون المستخدم عضوًا فيها، ويمكن اعتبار أي رسائل بريد إلكتروني يتم إرسالها إلى مجموعة يكون المستخدم عضوًا فيها جزءًا من صندوق بريدهم. 2- عرض جميع رسائل البريد الإلكتروني المرسلة بواسطة مستخدم (أحد أعضاء المجموعة) مرتبة حسب تاريخ البريد الإلكتروني. و ستحتاج إلى استعلام جدول Email وتصفية النتائج حسب عمود SenderID لتطابق معرف المستخدم، وتستطيع بعد ذلك فرز النتائج حسب عمود emailDate لترتيبها حسب التاريخ. 3- عرض جميع رسائل البريد الإلكتروني في مجموعة المستخدمين استخدم هنا استعلام جدول Email والانضمام إلى جدول UserGroup لتحديد رسائل البريد الإلكتروني التي تم إرسالها إلى المجموعة، ثم تصفية النتائج حسب عمود GroupID لتطابق معرف المجموعة. 4- إضافة مستخدم إلى مجموعة هنا عليك إدراج صف جديد في جدول UsersinGroup مع معرف المستخدم ومعرف المجموعة.
  13. حاول أولاً إعادة تشغيل المتصفح، وإن استمرت المشكلة، قم بالضغط على أيقونة القفل بجانب اسم الموقع ثم اختر cookies and site data: ثم اختر manage cookies and site data وستظهر لك نافذة قم بحذف أي ملفات مؤقتة بالضغط على أيقونة سلة المهملات، ثم اضغط على done، والآن أعد تحديث الصفحة وتسجيل الدخول وتفقد هل تم حل المشكلة أم لا.
  14. فرضاً أن لديك جدولين posts و comments، وتحتاج إلى عرض البيانات من كل جدول في صفحة واحدة. ففي المتحكم PostController، نكتب التالي: public function showPage() { $posts = Post::all(); $comments = Comment::all(); return view('page.show', compact('posts', 'comments')); } في صفحة العرض (resources/views/page/show.blade.php): <!-- عرض البيانات من جدول posts --> <h2>Posts</h2> @foreach ($posts as $post) <p>{{ $post->title }}</p> <p>{{ $post->content }}</p> @endforeach <!-- عرض البيانات من جدول comments --> <h2>Comments</h2> @foreach ($comments as $comment) <p>{{ $comment->text }}</p> @endforeach و لاحظ أنك تستطيع استخدام أي نوع من العمليات البرمجية للتحكم في كيفية عرض البيانات، مثل إضافة شروط if أو القيام بعمليات تحويل البيانات قبل عرضها.
  15. لديك مشكلة في الإعتماديات dependencies حاول تنفيذ الأمر التالي: gradlew build --refresh-dependencies
  16. لتسهيل الأمر سنستخدم قاعدة بيانات SQLite، وإليك مثال بسيط باستخدام بايثون ومكتبة SQLite: 1- إنشاء قاعدة بيانات وجدول import sqlite3 # اتصال بقاعدة البيانات (ستقوم بإنشاء ملف بنفس موقع السكربت) conn = sqlite3.connect('database.db') cursor = conn.cursor() # إنشاء جدول لتخزين المستخدمين ومنشوراتهم cursor.execute(''' CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL ) ''') cursor.execute(''' CREATE TABLE IF NOT EXISTS posts ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER, content TEXT NOT NULL, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ) ''') # حفظ التغييرات وإغلاق الاتصال conn.commit() conn.close() 2- إضافة مستخدم ومنشورات له def add_user_and_posts(name, posts): conn = sqlite3.connect('database.db') cursor = conn.cursor() # إضافة المستخدم cursor.execute('INSERT INTO users (name) VALUES (?)', (name,)) user_id = cursor.lastrowid # استخراج معرف المستخدم الجديد # إضافة المنشورات for post in posts: cursor.execute('INSERT INTO posts (user_id, content) VALUES (?, ?)', (user_id, post)) # حفظ التغييرات وإغلاق الاتصال conn.commit() conn.close() # مثال على إضافة مستخدم ومنشورات add_user_and_posts('John Doe', ['منشور 1', 'منشور 2', 'منشور 3']) 3- استرجاع أحدث منشور وعرضه def get_latest_post(user_id): conn = sqlite3.connect('database.db') cursor = conn.cursor() # الحصول على أحدث منشور للمستخدم cursor.execute('SELECT content, timestamp FROM posts WHERE user_id = ? ORDER BY timestamp DESC LIMIT 1', (user_id,)) result = cursor.fetchone() # إغلاق الاتصال conn.close() return result # مثال على استرجاع أحدث منشور latest_post = get_latest_post(1) # حيث 1 هو معرف المستخدم if latest_post: content, timestamp = latest_post print(f'أحدث منشور: "{content}" في {timestamp}') else: print('لم يتم العثور على منشورات')
  17. أنت لم توضح إطار العمل الذي تنوي استخدامه هل هو flask أم Django أم ستعتمد على بايثون فقط؟
  18. لا مشكلة في ذلك، عليك فقط رفع كامل المحادثة كما أوضحت من خلال الأداة المذكورة وبدون تقطيع في الصورة الملتقطة، وأيضًا إرفاق ملفات المشروع النهائية الخاصة بالعميل.
  19. هل تقصد أنك تريد معرفة الدورة المناسبة لك في الأكاديمية؟
  20. بالطبع ابحث عن Timsort algorithm ويوجد لها شرح بالإنجليزية فقط.
  21. الدالة sort تستخدم خوارزميات فعالة للفرز تعتمد على الأداء، مثل Timsort. و Timsort هي خوارزمية مركبة تجمع بين خصائص خوارزميات الفرز الدمجي (Merge Sort) والفرز الإدراجي (Insertion Sort)، مما يجعلها فعالة في معالجة مجموعات البيانات المختلفة. بالمقابل، خوارزميات الفرز مثل Bubble Sort وSelection Sort تعتبر أبسط ولكنها أقل فعالية من حيث الأداء، خاصة عند التعامل مع مجموعات بيانات كبيرة. لذا، عندما تحتاج إلى فرز مجموعة صغيرة من البيانات أو عامل الوقت (الأداء) أمرًا ثانويًا، بإمكانك استخدام أيِ من Bubble Sort أو Selection Sort. ولكن في معظم الحالات، يُفضل استخدام الدالة sort في Python التي تستند إلى Timsort، خاصةً عند التعامل مع مجموعات بيانات كبيرة. حيث تشترك خوارزميات bubble sort و selection sort في نفس تعقيد الوقت في أسوأ الحالات، وهو O(n^2)، مما يعني أن عدد العمليات التي يتعين القيام بها لفرز المصفوفة يتناسب مع مربع حجم المصفوفة. بينما، تتمتع الدالة sort بأداء أفضل بكثير، حيث تعتمد على خوارزمية أكثر تعقيدًا، ولكنها أكثر فعالية، وتعقيد الوقت في أسوأ الحالات للدالة sort هو O(n log n)، أي أن عدد العمليات التي يتعين القيام بها لفرز المصفوفة يتناسب مع حاصل ضرب حجم المصفوفة وسجل حجم المصفوفة.
  22. من الأفضل إرفاق مجلد المشروع بعد ضغطه لتفقد الكود وتوفير حل مناسب. وعامًة من الأفضل استخدام flexbox لتنسيق العناصر، وعرضها من اليمين إلى اليسار فأنتي حاليًا تقومي بعرض النص جهة اليسار بجانب الحقول وذلك غير مناسب كتجربة مستخدم.
  23. سأوضح لك الأمر من خلال جافاسكريبت وتسطيع تنفيذ ذلك في React.js بكل سهولة. سنتعمد على ميثود startsWith وendsWith التابعين للسلاسل النصية في جافاسكريبت، وإليك مثال: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> .highlighted-word { color: red; /* أو أي خصائص أخرى ترغب في تطبيقها */ font-weight: bold; } </style> <title>Highlight Word Example</title> </head> <body> <p id="dynamicText">مرحبا بكم يا أصدقائي</p> <script> const highlightWord = (startChar, endChar, className) => { // الحصول على عنصر النص في الصفحة const paragraph = document.getElementById('dynamicText'); // التأكد من أن النص موجود if (paragraph) { // تحويل نص الفقرة إلى مصفوفة من الكلمات const words = paragraph.textContent.split(' '); // حلق عبر الكلمات للبحث عن الكلمة المناسبة for (let i = 0; i < words.length; i++) { const word = words[i]; // التحقق مما إذا كانت الكلمة تبدأ بالحرف المحدد وتنتهي بالحرف المحدد if (word.startsWith(startChar) && word.endsWith(endChar)) { // إضافة الكلاس المحدد للكلمة words[i] = `<span class="${className}">${word}</span>`; } } // إعادة بناء نص الفقرة مع التأكيد على الكلاس المحدد paragraph.innerHTML = words.join(' '); } }; // استدعاء الدالة مع المعلمات المحددة highlightWord('أ', 'ي', 'highlighted-word'); </script> </body> </html>
  24. غالبًا أنت تعمل على مشروع ووردبريس، حاول وضع مجلد wordpress في المسار الصحيح وهو داخل مجلد htdocs لكي يتمكن سيرفر Apache من قراءة ملفات PHP.
  25. أرجو منك حذف المستودع من على GitHub وستجد شرح لذلك هنا: بعد ذلك قم بحذف مجلد .git في المجلد الذي به المشاريع وتراه مخفي لديك كما بالصورة فقم بحذفه. بعد ذلك قم بإنشاء مستودع جديد على GitHub، ثم توجه افتح منفذ الأوامر في مسار المجلد الذي به المشاريع ونفذ الأوامر التالية بالترتيب: git init // ثم git add . // ثم git commit -m "first commit" // ثم git branch -M main // ثم git remote add origin https://github.com/ اسم المستخدم/repoName.git // ثم git push -u origin main
×
×
  • أضف...