سؤال

أنا أكتب مرشح مكافحة البريد العشوائي/الرسائل السيئة وأحتاج إليه إذا كان ذلك ممكنًا،

لمطابقة (اكتشاف) الكلمات التي تتكون من أحرف مختلطة فقط مثل:fr1&nd$ وليس أصدقاء

هل هذا ممكن مع regex !؟

أطيب التحيات!

هل كانت مفيدة؟

المحلول

بالطبع هذا ممكن مع regex!أنت لا تطلب مطابقة الأقواس المتداخلة!:ص

لكن نعم، هذا هو الشيء الذي تم إنشاء التعبيرات العادية من أجله.مثال:

/\S*[^\w\s]+\S*/

سيطابق هذا كل ما يلي:

@ss
as$
a$s
@$s
a$$
@s$
@$$

فإنه سوف لا تطابق هذا:

ass

والذي أعتقد أنه ما تريد.كيف تعمل:

\S* يطابق 0 أو أكثر من الأحرف غير الفضائية. [^\w\s]+ يطابق الرموز فقط (سيطابق أي شيء ليس كلمة أو مسافة)، ويطابق رمزًا واحدًا منها أو أكثر (لذلك يلزم وجود حرف رمز.) ثم \S* يطابق مرة أخرى 0 أو أكثر من الأحرف غير الفضائية (الرموز والحروف).

إذا سمح لي باقتراح استراتيجية أفضل، في Perl يمكنك تخزين التعبير العادي في متغير.لا أعرف إذا كان بإمكانك القيام بذلك في PHP، ولكن إذا كنت تستطيع ذلك، يمكنك إنشاء قائمة من المتغيرات مثل هذا:

$a = /[aA@]/ # regex that matches all a-like symbols
$b = /[bB]/
$c = /[cC(]/
# etc...

أو:

$regex = array( 'a' => /[aA@]/, 'b' => /[bB]/, 'c' => /[cC(]/, ... );

وبهذه الطريقة، يمكنك مطابقة كلمة "friend" بكل تباديلها مع:

/$f$r$i$e$n$d/

أو:

/$regex['f']$regex['r']$regex['i']$regex['e']$regex['n']$regex['d']/

من المؤكد أن الخيار الثاني يبدو مطولًا بلا داعٍ، ولكن هذا هو PHP المناسب لك.أعتقد أن الحل الثاني هو على الأرجح الحل الأفضل، لأنه يخزنها كلها في تجزئة، وليس كلها كمتغيرات منفصلة، ​​لكنني أعترف أن التعبير العادي الذي ينتجه قبيح بعض الشيء.

نصائح أخرى

ومن الممكن، سوف لا يكون لديك قواعد التعابير المنطقية جميلة جدا، ولكن هل يمكن أن تتطابق أساسا أي النمط الذي يمكن وصفها باستخدام التعابير المنطقية. الجزء الصعب هو وصف ذلك.

وإنني أعتقد أنه سيكون لديك مجموعة من القواعد التعابير المنطقية للكشف عن كلمات بذيئة مثل ذلك:

لكشف FR1 والثانية $، والأصدقاء، الاب ** الثانية * يمكنك استخدام التعابير المنطقية مثل:

و/fr[1iI*][&eE]nd[s$Sz]/

والقيام بشيء من هذا القبيل لكل قاعدة سوف تجد كل الاختلافات من الشخصيات المحتملة في الأقواس. التقاط دليل التعابير المنطقية لمزيد من المعلومات.

و(أفترض لمرشح BADWORDS كنت تريد friend وكذلك frie**، قد ترغب في إخفاء كلمة سيئة وكذلك جميع التبديلات الممكنة)

ولم يختبر هذا تماما، ولكن هذا ينبغي أن نفعل ذلك:

(\w+)*(?<=[^A-Za-z ])

هل يمكن بناء بعض التعابير العادية كما يلي:

\p{L}+[\d\p{S}]+\S*

وهذا سوف تتطابق مع أي تسلسل واحد أو أكثر من الحروف (\p{L}+، انظر> وأ href = "http://docs.php.net/manual/regexp.reference.php#regexp.reference.unicode" يختلط = "نوفولو noreferrer "> تفضيلات حرف Unicode )، واحد أو أكثر من الأرقام أو الرموز ([\d\p{S}]+) وأي التالية \S* أحرف غير مسافة بيضاء.

$str = 'fr1&nd$ and not friends';
preg_match('/\p{L}+[\d\p{S}]+\S*/', $str, $match);
var_dump($match);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top