التحقق من سلسلة مقابل نمط
-
20-09-2019 - |
سؤال
أريد التحقق من المحتوى المنشور مقابل نمط. أواجه مشكلة في إعداد هذا preg_match (أو صفيف؟). النمط يجري ...
TEXTHERE:TEXTHERE
TEST:TEST
FILE:FILE
و
TEXTHERE:TEXTHERE TEST:TEST FILE:FILE
أرغب في التحقق من أي من النمطين ، والمساحة البيضاء والآخر مع كسر الخط. إذا كان المحتوى المنشور هذا ... (مع فواصل خط إضافية و/أو مساحة بيضاء)
TEXTHERE:TEXTHERE
TEST:TEST
FILE:FILE
أريده أن يعرض بطريقة ما ...
TEXTHERE:TEXTHERE
TEST:TEST
FILE:FILE
وما زالت تتطابق مع النمط.
أريد أن لا يزال يعمل ، بطريقة أو بأخرى عن طريق تجريد سطر الإضافي/أو مساحة بيضاء إضافية ...
$loader = file_get_contents( 'temp/load-'.$list.'.php' );
إذا لم يتبع نمط السلسلة ، فأريد أن يخرج رسالة خطأ ، إلخ.
if($loader == ???) { // done
} else { // error
}
المحلول
جرب شيئًا كهذا:
$loader = 'TEXTHERE:TEXTHERE
TEST:TEST
FILE:FILE';
if(preg_match('/^[A-Z]+:[A-Z]+(\s+[A-Z]+:[A-Z]+)*$/', $loader)) {
echo preg_replace('/\s{2,}/', "\n", $loader);
}
انتاج:
TEXTHERE:TEXTHERE
TEST:TEST
FILE:FILE
ستحصل على نفس الإخراج لـ:
$loader = 'TEXTHERE:TEXTHERE TEST:TEST FILE:FILE';
تقوم أولاً بالتحقق مما إذا كان يتطابق:
[A-Z]+:[A-Z]+ # match a word followed by a colon followed by a word
( # open group 1
\s+ # match one or more white space chars (includes line breaks!)
[A-Z]+:[A-Z]+ # match a word followed by a colon followed by a word
)* # close group 1 and repeat it zero or more times
وإذا كان يتطابق مع ما سبق ، فستحل محل 2 أو أكثر من الفضاء الأبيض المتتالي \s{2,}
مع استراحة سطر واحد.
بالطبع ، قد تحتاج إلى ضبط [A-Z]+
لشيء آخر.
نصائح أخرى
preg_match('~^\s*(\S+:\S+(\s+|$))+$~', $str)
هذا يتطابق مع "AA: BB CC: DD" أو "AA: BB N CC: DD" ويفشل في "AA: BB FOO CC: DD"
if(preg_match_all('/([A-Za-z0-9-_\.:]+)[\n\s]*/', $subject, $matches)){
print $matches[0][0]."<br />".$matches[0][1]."<br />".$matches[0][2];
}else{
// error
}