سؤال

أريد التحقق من المحتوى المنشور مقابل نمط. أواجه مشكلة في إعداد هذا 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
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top