بناء جملة التعبير العادي في PHP لاستخراج جميع مثيلات التنسيق
سؤال
أحاول استخراج كافة مثيلات تنسيق معين من سلسلة:
أتساءل عما إذا كان جهاز Sony الجديد [PT# 123456ABC;Sony] لديها هذه الميزة ولكن صديقي يقول أن Toshiba الجديد [PT# AD-3232hjk;توشيبا] لديه هذه الميزة.
أود أن أستخرج:
[PT # 123456ABC؛سوني]
[PT# AD-3232hjk؛توشيبا]
كما ترون هنا، العناصر الوحيدة في المواضع الثابتة هي:
- [PT#
- ;
- ]
كنت أحاول استخدام أنواع مختلفة من strpos() ولكن نظرًا للأطوال والتنسيقات المختلفة لأرقام الأجزاء وأسماء الشركات المصنعة، لم أتمكن من سحب تلك المثيلات بشكل موثوق من سلسلة أكبر بكثير.لقد كنت أحاول طرقًا مختلفة لاستخدام التعبيرات العادية لحل هذه المشكلة ولكن معرفتي بها محدودة إلى حد ما.بعد أن أقوم باستخراج هذه التعبيرات ووضعها في متغيرات، سأحتاج بعد ذلك إلى فصل أرقام الأجزاء وأسماء الشركات المصنعة عن التعبير.وقد يكون تحقيق ذلك أسهل أيضًا باستخدام التعبيرات العادية.
هو موضع تقدير أي مساعدة.شكرًا
المحلول
أعتقد أن هذا سيفعل ذلك
preg_match_all( "/(\[PT#\s+.*?;\s+.*?\])/", $input, $matches );
print_r( $matches );
وبدلاً من ذلك، إذا كنت تريد فقط التقاط المعلومات الفريدة
preg_match_all( "/\[PT#\s+(.*?);\s+(.*?)\]/", $input, $matches );
نصائح أخرى
$matches = array();
preg_match_all( "/\[PT#([^\];]+);([^\]]+)\]/", $input, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
echo "id=", trim($match[1]), " brand=", trim($match[2]), "\n";
}
أعتبر أنك ستقرأ من ملف نصي يحتوي على الكثير من تلك الإدخالات.ما يمكنك فعله هو:
preg_match_all("/\[PT#(.*?);[.*]?(.*?)\]/i", $text, $result);
سيضع جميع المطابقات في المصفوفة $result ويمكنك الوصول إليها على النحو التالي:
echo $result[1][0]; //echos first occurrence's serial
يتم فرز $result في العمود الرئيسي ويكون الإدخال الأول في المطابقة هو سلسلة المطابقة الكاملة
echo $result[0][0]; // would print [PT# 123456ABC; Sony]
echo $result[1][0]; // would print 123456ABC
echo $result[2][0]; // would print Sony
امل ان يساعد
يحرر:تم إصلاح التعبير العادي، ويجب أن يعمل الآن (لم يتم اختباره بعد)