/ PM بناء جملة Regex لإرسال رسالة في غرفة الدردشة
-
19-09-2019 - |
سؤال
أنا أعمل على غرفة AJAX / PHP chad وانت عالقة حاليا على Regex للكشف عن ما إذا كان المستخدم قد أرسل مساء ثم العمل من هو أيضا وما هي الرسالة.
إذا كان المستخدم أنواع شيء مثل
/ PM Pezcuckow مرحبا بكم رائع جدا!
أرغب في الاختبار الأول إذا تطابقت سلسلة بلدي من هذا النمط، ثم احصل على "Pezcuckow" و "مرحبا هناك!" كسلاسل للنشر إلى PHP.
لقد قمت ببعض الأبحاث على Regex ولكن ليس لها فكرة حقا أين أن أبدأ بهذا! هل يمكنك المساعدة
== بفضل الجميع مساعدة هذا يتم حلها الآن! ==
var reg = /^\/pm\s+(\w+)\s+(.*)$/i;
var to = "";
if(message.match(reg)) {
m = message.match(reg);
to = m[1];
message = m[2];
}
المحلول
كيف حول هذا:
var reg = /^\/pm\s+(\w+)\s+(.*)$/i,
m = '/pm PezCuckow Hi There you so awesome!'.match(reg);
m[0]; // "PezCuckow"
m[1]; // "Hi There you so awesome!"
يطابق "/pm"
تليها Whitespace. " "
(تقبل بحرية المساحات الإضافية)، تليها اسم المستخدم \w+
, تليها مسافة بيضاء " "
Agin، ثم أخيرا الرسالة .*
(وهو أساس كل شيء في نهاية الخط).
نصائح أخرى
هذا Regex يوزع رسالة:
^(?:\s*/(\w+)\s*(\w*)\s*)?((?:.|[\r\n])*)$
تفسير:
^ # start-of-string
(?: # start of non-capturing group
\s*/ # a "/", preceding whitespace allowed
(\w+) # match group 1: any word character, at least once (e.g. option)
\s+ # delimiting white space
(\w*) # match group 2: any word character (e.g. target user)
\s+ # delimiting white space
)? # make the whole thing optional
( # match group 3:
(?: # start of non-capturing group, either
. # any character (does not include newlines)
| # or
[\r\n] # newline charaters
)* # repeat as often as possible
) # end match group 3
في حالتك ("/pm PezCuckow Hi There you so awesome!"
):
- المجموعة 1: "PM"
- المجموعة 2: "Pezcuck"
- المجموعة 3: "مرحبا هناك رائع جدا!"
في حالة أكثر عمومية ("Hi There you so awesome!"
)
- مجموعة 1: ""
- المجموعة 2: ""
- المجموعة 3: "مرحبا هناك رائع جدا!"
لاحظ أن خفض الأمام يحتاج إلى الضغط من حرفي JavaScript Regex:
/foo\/bar/
ولكن ليس في أنماط ريجيكس بشكل عام.
على افتراض أن أحرف الكلمات فقط (بدون مسافات، إلخ) صالحة في حقل الاسم، فهذه سوف تفعل ما تريد:
var re = /(\/\w+) (\w+) (.+)/;