اذهب الي المحتوي
أوفيسنا
بحث مخصص من جوجل فى أوفيسنا
Custom Search

الردود الموصى بها

قام بنشر

السلام عليكم ورحمة الله وبركاته

اليوم اقدم لك وظيفة  ( مُطَهَّرُ النُّصُوصِ الْعَرَبِيَّةِ - الإصدار الثانى  )  

باختصار بعد هذا الموضوع

 

 

 اداة مطهر النصوص المرنه  - FlexiTextSanitizer

الوصف:
هي أداة تهدف إلى تنظيف النصوص العربية (وغيرها) بكفاءة عالية مع دعم واسع للتخصيص.

توفر الدالة الرئيسية خيارات متعددة لمعالجة النصوص بما في ذلك

  •  تطبيع الأحرف العربية
  • إزالة الحركات 
  • التحكم في الأرقام والأحرف الخاصة 
  • إضافة أقواس تلقائية حول الأرقام 
  • الاحتفاظ بالرموز الرياضية مثل √ و∑

المميزات الرئيسية:

  • دعم اللغات:
  1. عربية
  2. لاتينية
  3. أو كلاهما 

 

  • التحكم في الأرقام والرموز:
  1. الاحتفاظ بها
  2. إزالتها
  3. أو إضافة أقواس تلقائية

 

  • معالجة علامات الترقيم:
  1. الاحتفاظ بها كلها
  2. إزالتها
  3.  أو الاكتفاء بالفواصل والنقاط

 

  • دعم الرموز الرياضية:  الاحتفاظ برموز مثل ∞ و≠ في الحالات المحددة

 

  • التطبيع: توحيد الأحرف العربية (مثل تحويل إِ إلى ا).

 

كيف تعمل؟

المدخلات: نص خام مع خيارات اختيارية (تطبيع - لغة - معالجة - ترقيم)

المعالجة:

تطبيع الأحرف (اختياري)

إزالة الحركات

إضافة أقواس حول الأرقام (إذا طُلب)

تنظيف النص بناءً على نمط محدد

تقليص المسافات

المخرجات: نص نظيف و منسق حسب الخيارات المحددة

 

الكود داخل الوحدة النمطية العامة
 

' تعداد لتحديد وضع اللغة
Public Enum LanguageMode
    ArabicOnly = 0      ' اللغة العربية فقط
    ArabicAndLatin = 1  ' اللغة العربية واللاتينية
    LatinOnly = 2       ' اللغة اللاتينية فقط
End Enum

' تعداد لتحديد وضع المعالجة
Public Enum ProcessingMode
    KeepAll = 0         ' الاحتفاظ بالأرقام والأحرف الخاصة
    removeNumbers = 1   ' إزالة الأرقام فقط
    KeepNumbersOnly = 2 ' الاحتفاظ بالأرقام وإزالة الأحرف الخاصة
    CleanAll = 3        ' تنظيف كامل (إزالة الأرقام والأحرف الخاصة)
    KeepBrackets = 4    ' الاحتفاظ بالأرقام والأقواس (مع إضافتها تلقائيًا)
    KeepSpecialSymbols = 5 ' الاحتفاظ بالرموز الرياضية والخاصة
End Enum

' تعداد لتحديد معالجة علامات الترقيم
Public Enum punctuationMode
    KeepAllPunctuation = 0  ' الاحتفاظ بجميع علامات الترقيم
    RemoveAllPunctuation = 1 ' إزالة جميع علامات الترقيم
    KeepBasicPunctuation = 2 ' الاحتفاظ فقط بالفواصل والنقاط (, .)
End Enum

' الدالة الرئيسية: FlexiTextSanitizer
Public Function FlexiTextSanitizer(inputText As String, Optional normalize As Boolean = False, _
                                    Optional langMode As LanguageMode = ArabicOnly, _
                                    Optional processMode As ProcessingMode = KeepAll, _
                                    Optional punctuationMode As punctuationMode = KeepAllPunctuation, _
                                    Optional customSpecialChars As String = "()،؛") As String
    On Error GoTo ErrorHandler
    
    If Nz(inputText, "") = "" Then
        FlexiTextSanitizer = ""
        Exit Function
    End If

    Dim sanitizedText As String
    sanitizedText = Trim(inputText)

    ' الخطوة 1: التطبيع إذا طُلب
    If normalize Then
        Dim charReplacementPairs As Variant
        charReplacementPairs = Array( _
            Array(ChrW(1573), ChrW(1575)), _
            Array(ChrW(1571), ChrW(1575)), _
            Array(ChrW(1570), ChrW(1575)), _
            Array(ChrW(1572), ChrW(1608)), _
            Array(ChrW(1574), ChrW(1609)), _
            Array(ChrW(1609), ChrW(1610)), _
            Array(ChrW(1577), ChrW(1607)), _
            Array(ChrW(1705), ChrW(1603)), _
            Array(ChrW(1670), ChrW(1580)))
        Dim pair As Variant
        For Each pair In charReplacementPairs
            sanitizedText = Replace(sanitizedText, pair(0), pair(1))
        Next
    End If

    ' الخطوة 2: إزالة الحركات باستخدام RegExp
    Dim regEx As Object
    Set regEx = CreateObject("VBScript.RegExp")
    regEx.Global = True
    regEx.Pattern = "[\u064B-\u0652\u0670]" ' نطاق الحركات العربية
    sanitizedText = regEx.Replace(sanitizedText, "")

    ' إزالة علامة السؤال بشكل افتراضي
    sanitizedText = Replace(sanitizedText, "?", "")

    ' الخطوة 3: إضافة أقواس تلقائية حول الأرقام إذا طُلب (KeepBrackets)
    If processMode = KeepBrackets Then
        regEx.Pattern = "(\b[\u0660-\u0669\u0030-\u0039]+\b)" ' الأرقام العربية واللاتينية
        sanitizedText = regEx.Replace(sanitizedText, "($1)")
    End If

    ' الخطوة 4: بناء نمط الأحرف المسموح بها
    Dim allowedPattern As String
    Select Case langMode
        Case ArabicOnly
            allowedPattern = "\u0621-\u064A" ' الأحرف العربية
        Case ArabicAndLatin
            allowedPattern = "\u0621-\u064A\u0041-\u007A" ' العربية واللاتينية (A-Z, a-z)
        Case LatinOnly
            allowedPattern = "\u0041-\u007A" ' اللاتينية فقط
    End Select

    ' إضافة الأرقام والأحرف الخاصة بناءً على وضع المعالجة
    Select Case processMode
        Case KeepAll
            allowedPattern = allowedPattern & "\u0660-\u0669\u0030-\u0039" & EscapeRegExChars(customSpecialChars)
        Case removeNumbers
            allowedPattern = allowedPattern & EscapeRegExChars(customSpecialChars)
        Case KeepNumbersOnly
            allowedPattern = allowedPattern & "\u0660-\u0669\u0030-\u0039"
        Case CleanAll
            ' لا شيء يُضاف (تنظيف كامل)
        Case KeepBrackets
            allowedPattern = allowedPattern & "\u0660-\u0669\u0030-\u0039\(\)" ' الاحتفاظ بالأرقام والأقواس
        Case KeepSpecialSymbols
            allowedPattern = allowedPattern & "\u0660-\u0669\u0030-\u0039\u2200-\u22FF" ' الأرقام والرموز الرياضية
    End Select

    ' إضافة علامات الترقيم بناءً على وضع المعالجة
    Select Case punctuationMode
        Case KeepAllPunctuation
            allowedPattern = allowedPattern & "!""#$%&'()*+,-./:;<=>?@[\\]^_`{|}~،؛"
        Case RemoveAllPunctuation
            ' لا شيء يُضاف (إزالة كل علامات الترقيم)
        Case KeepBasicPunctuation
            allowedPattern = allowedPattern & ",."
    End Select

    ' إضافة المسافة دائمًا وتطبيق النمط
    regEx.Pattern = "[^" & allowedPattern & "\s]" ' إزالة كل ما هو خارج النطاق
    sanitizedText = regEx.Replace(sanitizedText, "")

    ' الخطوة 5: تقليص المسافات المتعددة إلى واحدة
    regEx.Pattern = "\s+"
    sanitizedText = regEx.Replace(sanitizedText, " ")
    sanitizedText = Trim(sanitizedText)

    ' الخطوة 6: إرجاع النتيجة
    If Len(Trim(Nz(sanitizedText, ""))) = 0 Then
        FlexiTextSanitizer = vbNullString
    Else
        FlexiTextSanitizer = sanitizedText
    End If

    Exit Function

ErrorHandler:
    Debug.Print "خطأ في FlexiTextSanitizer: " & Err.Description
    FlexiTextSanitizer = ""
End Function

' دالة مساعدة: EscapeRegExChars
Private Function EscapeRegExChars(chars As String) As String
    Dim specialChars As Variant
    Dim i As Integer
    
    specialChars = Array("^", "$", ".", "*", "+", "?", "(", ")", "[", "]", "{", "}", "|", "\\", "`", "~", "&", "%", "#", "@", "<", ">")
    
    For i = LBound(specialChars) To UBound(specialChars)
        chars = Replace(chars, specialChars(i), "\" & specialChars(i))
    Next i
    
    EscapeRegExChars = chars
End Function


اضافة توثيق وشرح للكود فى رأس الموديول ليكون مفهوما ولايضاح الية الاستدعاء بالسيناريوهات المختلفة والممكنة وهذا اختياريا يمكن وضعه قبل الكود السابق
 

' توثيق الموديول:
' الغرض: هذا الموديول يحتوي على دالة FlexiTextSanitizer لتنظيف النصوص بدقة وسرعة مع دعم مرن للغات (العربية واللاتينية)، الأحرف الخاصة، علامات الترقيم، والرموز الرياضية.
' يستخدم تعدادات (Enums) لتسهيل الاستدعاء وتقليل الأخطاء، ويتيح التحكم الكامل في معالجة النصوص.
'
' سيناريوهات الاستدعاء:
' 1. تنظيف النص مع الاحتفاظ بالأرقام والأحرف الخاصة وعلامات الترقيم بدون تطبيع:
'    FlexiTextSanitizer(inputText, False, ArabicOnly, KeepAll, KeepAllPunctuation)
'    - مثال الناتج: "إشراف على بعض الأماكن أو المكان رقم (5 - 5)"
' 2. تنظيف النص مع إزالة الأرقام بدون تطبيع:
'    FlexiTextSanitizer(inputText, False, ArabicOnly, RemoveNumbers, KeepAllPunctuation)
'    - مثال الناتج: "إشراف على بعض الأماكن أو المكان رقم"
' 3. تنظيف النص مع الاحتفاظ بالأرقام فقط مع تطبيع:
'    FlexiTextSanitizer(inputText, True, ArabicOnly, KeepNumbersOnly, KeepAllPunctuation)
'    - مثال الناتج: "اشراف علي بعض الاماكن او المكان رقم 5 - 5"
' 4. تنظيف كامل مع تطبيع وإزالة علامات الترقيم:
'    FlexiTextSanitizer(inputText, True, ArabicOnly, CleanAll, RemoveAllPunctuation)
'    - مثال الناتج: "اشراف علي بعض الاماكن او المكان رقم"
' 5. تنظيف النص مع الاحتفاظ بالأرقام والأقواس (تلقائية) والفواصل والنقاط مع تطبيع:
'    FlexiTextSanitizer(inputText, True, ArabicOnly, KeepBrackets, KeepBasicPunctuation)
'    - مثال الناتج: "اشراف علي, بعض الاماكن او المكان رقم (5).(5)"
' 6. تنظيف النص مع دعم العربية واللاتينية والأحرف الخاصة وعلامات الترقيم:
'    FlexiTextSanitizer(inputText, False, ArabicAndLatin, KeepAll, KeepAllPunctuation, "().,")
'    - مثال الناتج: "إشراف على بعض الأماكن أو المكان رقم (5 - 5) Supervision"
' 7. تنظيف النص مع إزالة جميع علامات الترقيم:
'    FlexiTextSanitizer(inputText, False, ArabicOnly, KeepAll, RemoveAllPunctuation)
'    - مثال الناتج: "إشراف على بعض الأماكن أو المكان رقم 5 5"
' 8. تنظيف النص مع الاحتفاظ بالفواصل والنقاط فقط:
'    FlexiTextSanitizer(inputText, False, ArabicOnly, KeepAll, KeepBasicPunctuation)
'    - مثال الناتج: "إشراف على, بعض الأماكن أو المكان رقم 5.5"
' 9. تنظيف نص يحتوي على علامات ترقيم كثيرة:
'    FlexiTextSanitizer("!!!؟؟؟...،،،:::;;;---___***((()))", False, ArabicOnly, KeepAll, KeepAllPunctuation)
'    - مثال الناتج: "!!!...،،،:::;;;---___***(())"
' 10. تنظيف نص يحتوي على رموز رياضية مع الاحتفاظ بها:
'    FlexiTextSanitizer("√∑∫∏∂∆∞ ≠ ± × ÷", False, ArabicAndLatin, KeepSpecialSymbols, RemoveAllPunctuation)
'    - مثال الناتج: "√∑∫∏∂∆∞ ≠ ± × ÷"
' 11. تطبيع جميع الأشكال الممكنة:
'    FlexiTextSanitizer("إِ، أ، إ، ؤ، ئ، ى، ة، ك، چ", True, ArabicOnly, KeepAll, KeepAllPunctuation)
'    - مثال الناتج: "ا، ا، ا، و، ي، ي، ه، ك، ج"

ولكن ملحوطة صغيرة طبعا وللاسف محرر الاكواد هنا مع الاكسس فقيير جدا بعكس لغات البرمجة الاخرى لا يقبل الرموز لذلك الرموز الرياضية مثل : √∑∫∏∂∆∞ سوف تتغير داخل المحرر الى علامات استفهام

 

والان داله يمكن اضافتها فى نهاية الكود وهى مجرد للتجربة طباعه نتائج التجربه فى النافذة الفوريه ليكون المبرمج مطلعا وملما بالنتائج
 

' اختبار الدالة مع السيناريوهات المطلوبة
Sub TestFlexiTextSanitizer()
    Dim inputText As String
    inputText = "إِشْرَافٍ      عَلَى? بَعْضِ الْأَمَاكِنِ  أَوْ الْمَكَانِ رَقْمٌ  Supervision of some places or place number 5 - 5"

    Debug.Print "النص الأصلي: " & inputText
    Debug.Print "------------------------------------"

    Debug.Print "السيناريو 1 (تنظيف، الاحتفاظ بالأرقام والأحرف الخاصة، بدون تطبيع):"
    Debug.Print FlexiTextSanitizer(inputText, False, ArabicOnly, KeepAll, KeepAllPunctuation)
    Debug.Print "------------------------------------"

    Debug.Print "السيناريو 2 (تنظيف، إزالة الأرقام، بدون تطبيع):"
    Debug.Print FlexiTextSanitizer(inputText, False, ArabicOnly, removeNumbers, KeepAllPunctuation)
    Debug.Print "------------------------------------"

    Debug.Print "السيناريو 3 (تنظيف، الاحتفاظ بالأرقام، مع تطبيع):"
    Debug.Print FlexiTextSanitizer(inputText, True, ArabicOnly, KeepNumbersOnly, KeepAllPunctuation)
    Debug.Print "------------------------------------"

    Debug.Print "السيناريو 4 (تنظيف كامل، مع تطبيع):"
    Debug.Print FlexiTextSanitizer(inputText, True, ArabicOnly, CleanAll, RemoveAllPunctuation)
    Debug.Print "------------------------------------"

    Debug.Print "السيناريو 5 (تنظيف، الاحتفاظ بالأرقام والأقواس، مع تطبيع):"
    Debug.Print FlexiTextSanitizer(inputText, True, ArabicOnly, KeepBrackets, KeepBasicPunctuation)
    Debug.Print "------------------------------------"

    Debug.Print "السيناريو 6 (العربية واللاتينية مع أحرف خاصة مخصصة والاحتفاظ بجميع علامات الترقيم):"
    Debug.Print FlexiTextSanitizer(inputText, False, ArabicAndLatin, KeepAll, KeepAllPunctuation, "().,")
    Debug.Print "------------------------------------"
    
    Debug.Print "السيناريو 7 (العربية فقط، إزالة جميع علامات الترقيم):"
    Debug.Print FlexiTextSanitizer(inputText, False, ArabicOnly, KeepAll, RemoveAllPunctuation)
    Debug.Print "------------------------------------"
    
    Debug.Print "السيناريو 8 (العربية فقط، الاحتفاظ بالفواصل والنقاط فقط):"
    Debug.Print FlexiTextSanitizer(inputText, False, ArabicOnly, KeepAll, KeepBasicPunctuation)
    Debug.Print "------------------------------------"
    
    Debug.Print "السيناريو 9 (نص يحتوي على علامات ترقيم كثيرة جدًا):"
    Debug.Print FlexiTextSanitizer("!!!؟؟؟...،،،:::;;;---___***((()))", False, ArabicOnly, KeepAll, KeepAllPunctuation)
    Debug.Print "------------------------------------"
    
    Debug.Print "السيناريو 10 (نص يحتوي على رموز رياضية ورموز خاصة):"
    Debug.Print FlexiTextSanitizer(ChrW(8730) & ChrW(8721) & ChrW(8747) & ChrW(8719) & ChrW(8706) & ChrW(8710) & ChrW(8734) & ChrW(32) & ChrW(8800) & ChrW(32) & ChrW(177) & ChrW(32) & ChrW(215) & ChrW(32) & ChrW(247), False, ArabicAndLatin, KeepSpecialSymbols, RemoveAllPunctuation)
    Debug.Print "------------------------------------"
    
    Debug.Print "السيناريو 11 (تطبيع جميع الأشكال الممكنة):"
    Debug.Print FlexiTextSanitizer("إِ، أ، إ، ؤ، ئ، ى، ة، ك، چ", True, ArabicOnly, KeepAll, KeepAllPunctuation)
    Debug.Print "------------------------------------"
End Sub


 

  • Like 2
  • Moosak pinned this topic

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • اضف...

Important Information