سؤال

بسيطة جدا ولكن لا أستطيع الحصول على بناء الجملة الدقيق.

أريد فقط فحص حقيقي أو خطأ لمعرفة ما إذا كانت كائنات سلسلة مع "غير حساس للحالة).

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

المحلول

إذا كان الأمر كذلك، فيمكنك استخدام البحث عن نص عادي:

if (stripos("for the", $text) === 0) { // case-insensitive here
    // string starts with "for the"
}

أو،

if (substr($text, 0, 7) == "for the")

حصلت على التعليقات أدناه أتساءل عنها أسرع في الواقع، لذلك كتبت بعض المعايير.

إليك إصدار TLDR:

  • strpos هو سريع حقا إذا كنت لا تعمل مع سلاسل كبيرة.
  • strncmp موثوقة وسريعة.
  • preg_match ليس خيارا جيدا أبدا.

إليك النسخة الطويلة:

  • اثنين مختلفين "كومة الأزيز":
    1. 10000 حرف من lipsum.
    2. 83 حرفا من lipsum.
  • 5 طرق البحث المختلفة:
    1. وافر:
      return strpos($haystack, $needle) === 0
    2. preg_match.
      return preg_match("/^$needle/", $haystack) === 1
    3. سلع
      return substr($haystack, 0, strlen($needle)) === $needle
    4. strncmp.
      return strncmp($needle, $haystack, strlen($needle)) === 0
    5. الحلقات اليدوية:
for ($i = 0, $l = strlen($needle); $i < $l; ++$i) {
    if ($needle{$i} !== $haystack{$i}) return false;
}
return true;
  • 7 "إبر" مختلفة
    • 3 مطابقة (أطوال: 83، 5 و 1 حرف)
    • 4 غير مطابقة (أطوال: 83 و 82 و 5 و 1 حرف). لا تتطابق إبرة 82 Char على الإطلاق، وتتطابق إبر الحرف 83 من كل الحرف الأخير.
  • 100،000 التكرار، لكل طريقة لكل إبرة لكل كومة كومة

نقاط مثيرة للاهتمام:

  • كان أسرع اختبار فردي للجميع strpos على طول إبرة طويلة تماما غير مطابقة ضد قش القش القصير.
    • في الواقع، من بين الاختبارات ال 14 تدير لكل طريقة، strpos سجلت أعلى 11 مرة.
  • كان أبطأ اختبار فردي هو الطريقة اليدوية على الإبر الطويلة، بغض النظر عن حجم كومة القش. كانت هذه الاختبارات الأربعة أبطأ 10-20 مرة من جميع الاختبارات الأخرى تقريبا.
  • رغم ذلك strpos كان أفضل أداء، تم وزنه بسبب الإبر طويلة غير مطابقة على قش القش الطويل. كانوا أبطأ 5-10 مرات من معظم الاختبارات.
  • strncmp كان بسرعة و الأكثر اتساقا.
  • preg_match كان باستمرار حوالي 2 مرات أبطأ من الوظائف الأخرى
Haystack: 83 characters
              ______________________________________________________________
 ____________|__________ non-matching ___________|_______  matching ________|
| function   |   1    |   5    |   82   |   83   |   1    |   5    |   83   |
|------------+--------+--------+--------+--------+--------+--------+--------|
| manual     | 0.2291 | 0.2222 | 0.2266 | 4.1523 | 0.2337 | 0.4263 | 4.1972 |
| preg_match | 0.3622 | 0.3792 | 0.4098 | 0.4656 | 0.3642 | 0.3694 | 0.4658 |
| strncmp    | 0.1860 | 0.1918 | 0.1881 | 0.1981 | 0.1841 | 0.1857 | 0.1980 |
| strpos     | 0.1596 | 0.1633 | 0.1537 | 0.1560 | 0.1571 | 0.1589 | 0.1681 |
| substr     | 0.2052 | 0.2066 | 0.2009 | 0.2166 | 0.2061 | 0.2017 | 0.2236 |
-----------------------------------------------------------------------------

Haystack: 10000 characters
              ______________________________________________________________ 
 ____________|__________ non-matching ___________|_______  matching ________|
| function   |   1    |   5    |   82   |   83   |   1    |   5    |   83   |
|------------+--------+--------+--------+--------+--------+--------+--------|
| manual     | 0.2275 | 0.2249 | 0.2278 | 4.1507 | 0.2315 | 0.4233 | 4.1834 |
| preg_match | 0.3597 | 0.3628 | 0.4147 | 0.4654 | 0.3662 | 0.3679 | 0.4684 |
| strncmp    | 0.1886 | 0.1914 | 0.1835 | 0.2014 | 0.1851 | 0.1854 | 0.1989 |
| strpos     | 0.1605 | 2.1877 | 2.3737 | 0.5933 | 0.1575 | 0.1597 | 0.1667 |
| substr     | 0.2073 | 0.2085 | 0.2017 | 0.2152 | 0.2036 | 0.2090 | 0.2183 |
-----------------------------------------------------------------------------

نصائح أخرى

تريد استخدام ^ للدلالة على بداية السلسلة:

$string_one = "For the love of Mike";
$string_two = "for the amazing reason.";

$match = preg_match("/^for the/i", $string_one); // Outputs 1
$match = preg_match("/^for the/i", $string_two); // Outputs 1

ال /i هو الجزء الذي يجعل حالة البحث غير حساسة.

ماذا عن

if(preg_match("/^for the/", $yourString))
{
    return true;
}                   
else
{
    return false;
}

لاحظ رمز ^, ، يطابق بداية سلسلة.

إذا كان لديك قراءة المثال الأول في الوثائق كنت قد رأيت الجواب.

if ( preg_match('/^for the/i', $sentence) )
{
    // a match was found
}

Regex هو /^for the/i

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top