startsWith () และ endsWith () ฟังก์ชั่นใน PHP


1480

ฉันจะเขียนสองฟังก์ชั่นที่จะใช้สตริงและส่งคืนได้อย่างไรถ้าเริ่มต้นด้วยอักขระ / สตริงที่ระบุหรือลงท้ายด้วยมัน?

ตัวอย่างเช่น:

$str = '|apples}';

echo startsWith($str, '|'); //Returns true
echo endsWith($str, '}'); //Returns true

19
ดูที่คลาส Strของ Laravel เริ่มด้วย () และสิ้นสุดด้วย () สำหรับวิธีการทดสอบที่ดี พบกรณีขอบดังนั้นการใช้รหัสนี้อย่างแพร่หลายจึงเป็นข้อได้เปรียบ
Gras Double

1
คุณอาจพบs($str)->startsWith('|')และs($str)->endsWith('}')เป็นประโยชน์เท่าที่พบในห้องสมุดแบบสแตนด์อโลนนี้
caw

3
คำเตือน: คำตอบส่วนใหญ่ที่นี่ไม่น่าเชื่อถือในการเข้ารหัสแบบหลายไบต์เช่น UTF-8
ÁlvaroGonzález

ติดตามความคิดเห็นข้างต้นของฉันคุณอาจตรวจสอบให้แน่ใจว่าใช้เวอร์ชันล่าสุด (ณ วันนี้5.4 ) โดยเฉพาะอย่างยิ่ง startsWith () ได้รับการปรับให้เหมาะสมสำหรับสตริงที่มีกองหญ้าขนาดใหญ่
Gras Double

คำตอบ:


1612
function startsWith($haystack, $needle)
{
     $length = strlen($needle);
     return (substr($haystack, 0, $length) === $needle);
}

function endsWith($haystack, $needle)
{
    $length = strlen($needle);
    if ($length == 0) {
        return true;
    }

    return (substr($haystack, -$length) === $needle);
}

ใช้สิ่งนี้หากคุณไม่ต้องการใช้ regex


16
+1 นี่สะอาดกว่าคำตอบที่ยอมรับ นอกจากนี้ไม่จำเป็นต้องอยู่ในบรรทัดสุดท้ายของ$length endsWith()
php มากเกินไป

13
ฉันจะบอกลงท้ายด้วย ('foo', '') == false เป็นพฤติกรรมที่ถูกต้อง เพราะฟูไม่ได้จบลงด้วยอะไรเลย 'Foo' ลงท้ายด้วย 'o', 'oo' และ 'Foo'
MrHus

125
EndsWith สามารถเขียนได้สั้นกว่ามาก:return substr($haystack, -strlen($needle))===$needle;
Rok Kralj

12
คุณสามารถหลีกเลี่ยงifโดยสิ้นเชิงโดยผ่าน$lengthเป็นพารามิเตอร์ที่สามเพื่อ:substr return (substr($haystack, -$length, $length);นี้จัดการกรณีของโดยการกลับสตริงที่ว่างเปล่าและไม่ทั้งหมด$length == 0 $haystack
mxxk

20
@MrHus ฉันขอแนะนำให้ใช้ฟังก์ชั่นที่ปลอดภัยแบบหลายไบต์เช่น mb_strlen และ mb_substr
19Gerhard85

1024

คุณสามารถใช้substr_compareฟังก์ชั่นเพื่อตรวจสอบการเริ่มต้นและสิ้นสุดด้วย:

function startsWith($haystack, $needle) {
    return substr_compare($haystack, $needle, 0, strlen($needle)) === 0;
}
function endsWith($haystack, $needle) {
    return substr_compare($haystack, $needle, -strlen($needle)) === 0;
}

นี่ควรเป็นหนึ่งในโซลูชันที่เร็วที่สุดใน PHP 7 ( สคริปต์มาตรฐาน ) ทดสอบกับกองหญ้าขนาด 8KB, เข็มยาวหลากหลายแบบและแบบเต็ม, บางส่วนและไม่มีคู่จับคู่ strncmpเป็นแบบสัมผัสที่เร็วกว่าสำหรับการเริ่มต้นใช้งาน แต่ไม่สามารถตรวจสอบการสิ้นสุดด้วย


74
คำตอบนี้ทำให้ WTF รายวัน! : D ดูthedailywtf.com/articles/ …
Wim ten Brink

โปรดทราบว่าความคิดเห็น @DavidWallace และ @FrancescoMM นำไปใช้กับคำตอบนี้รุ่นเก่ากว่า คำตอบปัจจุบันจะใช้strrposซึ่งควรจะล้มเหลวทันทีหากเข็มไม่ตรงกับจุดเริ่มต้นของกองหญ้า
Salman

2
ฉันไม่เข้าใจ อ้างอิงจากphp.net/manual/en/function.strrpos.php : "ถ้าค่าเป็นลบการค้นหาจะเริ่มต้นจากอักขระหลายตัวนั้นจากจุดสิ้นสุดของสตริงค้นหาย้อนหลัง" ดูเหมือนว่าจะบ่งบอกว่าเราเริ่มต้นด้วยอักขระ 0 (เนื่องจาก-strlength($haystack)) และค้นหาจากข้างหลังใช่ไหม นั่นแปลว่าคุณไม่ได้ค้นหาอะไรเลยเหรอ? ฉันไม่เข้าใจ!== falseส่วนนี้ ฉันคาดเดาว่าสิ่งนี้จะขึ้นอยู่กับการเล่นโวหารของ PHP ที่ค่าบางอย่างเป็น "ความจริง" และอื่น ๆ "ผิดพลาด" แต่วิธีนี้ทำงานในกรณีนี้ได้อย่างไร
Welbog

3
@Welbog: ยกตัวอย่างเช่นกองหญ้า = xxxyyyเข็ม = yyyและการใช้เริ่มต้นค้นหาจากครั้งแรกstrrpos xตอนนี้เราไม่ได้มีการแข่งขันที่ประสบความสำเร็จที่นี่ (ที่พบ x แทน y) และเราไม่สามารถย้อนกลับไปได้อีกต่อไป (ซึ่งเราในช่วงเริ่มต้นของสตริง) ค้นหาล้มเหลวทันที เกี่ยวกับการใช้!== false- strrposในตัวอย่างด้านบนจะคืนค่า 0 หรือเท็จและไม่ใช่ค่าอื่น ในทำนองเดียวกันstrposในตัวอย่างข้างต้นสามารถกลับ$temp(ตำแหน่งที่คาดว่า) หรือเท็จ ฉันไปด้วย!== falseเพื่อความมั่นคง แต่คุณสามารถใช้=== 0และ=== $tempในฟังก์ชั่นตามลำดับ
Salman

8
@ spoo ได้รับการยอมรับแล้วว่า strpos === 0 เป็นทางออกที่น่ากลัวหากกองหญ้ามีขนาดใหญ่และไม่มีเข็มอยู่
Salman

243

อัปเดต 23 ส.ค. 2559

ฟังก์ชั่น

function substr_startswith($haystack, $needle) {
    return substr($haystack, 0, strlen($needle)) === $needle;
}

function preg_match_startswith($haystack, $needle) {
    return preg_match('~' . preg_quote($needle, '~') . '~A', $haystack) > 0;
}

function substr_compare_startswith($haystack, $needle) {
    return substr_compare($haystack, $needle, 0, strlen($needle)) === 0;
}

function strpos_startswith($haystack, $needle) {
    return strpos($haystack, $needle) === 0;
}

function strncmp_startswith($haystack, $needle) {
    return strncmp($haystack, $needle, strlen($needle)) === 0;
}

function strncmp_startswith2($haystack, $needle) {
    return $haystack[0] === $needle[0]
        ? strncmp($haystack, $needle, strlen($needle)) === 0
        : false;
}

การทดสอบ

echo 'generating tests';
for($i = 0; $i < 100000; ++$i) {
    if($i % 2500 === 0) echo '.';
    $test_cases[] = [
        random_bytes(random_int(1, 7000)),
        random_bytes(random_int(1, 3000)),
    ];
}
echo "done!\n";


$functions = ['substr_startswith', 'preg_match_startswith', 'substr_compare_startswith', 'strpos_startswith', 'strncmp_startswith', 'strncmp_startswith2'];
$results = [];

foreach($functions as $func) {
    $start = microtime(true);
    foreach($test_cases as $tc) {
        $func(...$tc);
    }
    $results[$func] = (microtime(true) - $start) * 1000;
}

asort($results);

foreach($results as $func => $time) {
    echo "$func: " . number_format($time, 1) . " ms\n";
}

ผลลัพธ์ (PHP 7.0.9)

(เรียงลำดับเร็วที่สุดไปช้าที่สุด)

strncmp_startswith2: 40.2 ms
strncmp_startswith: 42.9 ms
substr_compare_startswith: 44.5 ms
substr_startswith: 48.4 ms
strpos_startswith: 138.7 ms
preg_match_startswith: 13,152.4 ms

ผลลัพธ์ (PHP 5.3.29)

(เรียงลำดับเร็วที่สุดไปช้าที่สุด)

strncmp_startswith2: 477.9 ms
strpos_startswith: 522.1 ms
strncmp_startswith: 617.1 ms
substr_compare_startswith: 706.7 ms
substr_startswith: 756.8 ms
preg_match_startswith: 10,200.0 ms

startswith_benchmark.php


3
หากสตริงไม่ว่างเปล่าเช่นเดียวกับในการทดสอบของคุณจริง ๆ แล้วจะเร็วกว่านี้ (20-30%): function startswith5b($haystack, $needle) {return ($haystack{0}==$needle{0})?strncmp($haystack, $needle, strlen($needle)) === 0:FALSE;}ฉันเพิ่มคำตอบด้านล่าง
FrancescoMM

3
@Jronny เพราะ 110 น้อยกว่า 133 ... ??
mpen

2
ยี้ฉันไม่รู้ว่าสิ่งที่เกิดขึ้นกับฉันในครั้งนั้น อาจจะอดนอนไม่ได้
Jronny

1
@mpen ฉันสังเกตว่าไม่ใช่ช้างเลย :(
Visman

1
การทดสอบเหล่านี้ไม่ดีในการทดสอบประสิทธิภาพ สิ่งที่คุณกำลังทำคือการใช้สตริงสุ่มเป็นเข็ม ในกรณี 99.99% จะไม่มีการแข่งขัน ฟังก์ชั่นส่วนใหญ่จะออกหลังจากจับคู่ไบต์แรก กรณีใดบ้างเมื่อพบคู่ที่ตรงกัน ฟังก์ชันใดใช้เวลาอย่างน้อยในการสรุปการแข่งขันที่ประสบความสำเร็จ แล้วกรณีที่ 99% ของเข็มตรงกัน แต่ไม่ใช่สองสามไบต์สุดท้าย ฟังก์ชั่นใดใช้เวลาอย่างน้อยในการสรุปการแข่งขัน
Salman

137

คำตอบทั้งหมดเพื่อให้ห่างไกลดูเหมือนจะทำโหลดของการทำงานที่ไม่จำเป็นstrlen calculations, string allocations (substr)ฯลฯ'strpos'และ'stripos'ฟังก์ชั่นกลับของดัชนีเกิดขึ้นครั้งแรกของ$needleใน$haystack:

function startsWith($haystack,$needle,$case=true)
{
    if ($case)
        return strpos($haystack, $needle, 0) === 0;

    return stripos($haystack, $needle, 0) === 0;
}

function endsWith($haystack,$needle,$case=true)
{
    $expectedPosition = strlen($haystack) - strlen($needle);

    if ($case)
        return strrpos($haystack, $needle, 0) === $expectedPosition;

    return strripos($haystack, $needle, 0) === $expectedPosition;
}

2
endsWith()ฟังก์ชั่นมีข้อผิดพลาด บรรทัดแรกควรเป็น (โดยไม่มี -1): $expectedPosition = strlen($haystack) - strlen($needle);
Enrico Detoma

6
สิ่งที่ strlen () ไม่จำเป็น ในกรณีที่สายไม่ได้เริ่มต้นด้วยเข็มที่กำหนดแล้วรหัส ur จะสแกนกองหญ้าทั้งหมดโดยไม่จำเป็น
AppleGrew

5
@ Mark yea การตรวจสอบจุดเริ่มต้นนั้นเร็วขึ้นมากโดยเฉพาะถ้าคุณกำลังทำอะไรบางอย่างเช่นการตรวจสอบประเภท MIME (หรือที่อื่น ๆ ที่สตริงถูกผูกไว้ให้มีขนาดใหญ่)
chacham15 15

2
@mark ฉันทำเกณฑ์มาตรฐานด้วย 1,000 charay hackstack และ 10 หรือ 800 char char และ strpos เร็วขึ้น 30% ทำ
เบนช์มาร์ก

7
คุณควรพิจารณาอย่างยิ่ง quoting เข็มเช่นstrpos($haystack, "$needle", 0)ถ้ามีใด ๆโอกาสมันไม่ได้อยู่แล้วสตริง (เช่นถ้ามันมาจากjson_decode()) มิฉะนั้นพฤติกรรมเริ่มต้น [แปลก] ของstrpos()อาจทำให้เกิดผลลัพธ์ที่ไม่คาดคิด: " ถ้าเข็มไม่ใช่สตริงมันจะถูกแปลงเป็นจำนวนเต็มและนำไปใช้เป็นค่าปกติของตัวละคร "
quietmint

46
function startsWith($haystack, $needle, $case = true) {
    if ($case) {
        return (strcmp(substr($haystack, 0, strlen($needle)), $needle) === 0);
    }
    return (strcasecmp(substr($haystack, 0, strlen($needle)), $needle) === 0);
}

function endsWith($haystack, $needle, $case = true) {
    if ($case) {
        return (strcmp(substr($haystack, strlen($haystack) - strlen($needle)), $needle) === 0);
    }
    return (strcasecmp(substr($haystack, strlen($haystack) - strlen($needle)), $needle) === 0);
}

เครดิตถึง :

ตรวจสอบว่าสตริงสิ้นสุดด้วยสตริงอื่นหรือไม่

ตรวจสอบว่าสตริงเริ่มต้นด้วยสตริงอื่น


1
strtolower ไม่ใช่วิธีที่ดีที่สุดในการสร้างฟังก์ชั่นที่ไม่สนใจขนาดตัวพิมพ์ ในบางพื้นที่เคสมีความซับซ้อนมากกว่าแค่บนและล่าง
Sander Rijken

8
ฉันเห็นการบ่นและไม่มีวิธีแก้ปัญหา ... ถ้าคุณจะบอกว่ามันแย่คุณควรยกตัวอย่างว่ามันควรจะเป็นเช่นไร
KdgDev

2
@WebDevHobo: นั่นเป็นเหตุผลที่ฉันเพิ่มคำตอบตัวเองหนึ่งวันก่อนแสดงความคิดเห็นของคุณ สำหรับรหัส strcasecmp ของคุณเป็นสิ่งที่ถูกต้อง
Sander Rijken

29

ฟังก์ชัน regex ด้านบน แต่ด้วย tweaks อื่น ๆ ยังแนะนำข้างต้น:

 function startsWith($needle, $haystack) {
     return preg_match('/^' . preg_quote($needle, '/') . '/', $haystack);
 }

 function endsWith($needle, $haystack) {
     return preg_match('/' . preg_quote($needle, '/') . '$/', $haystack);
 }

2
ใน php สำหรับการทำงานของสตริงการเรียงลำดับพารามิเตอร์คือ $ haystack, $ needle ฟังก์ชั่นเหล่านี้เป็นแบบย้อนกลับและทำหน้าที่เหมือนฟังก์ชั่นอาร์เรย์
Andy

29

คำถามนี้มีคำตอบมากมายอยู่แล้ว แต่ในบางกรณีคุณสามารถชำระบางสิ่งได้ง่ายกว่าคำถามทั้งหมด หากรู้จักสตริงที่คุณต้องการ (ฮาร์ดโค้ด) คุณสามารถใช้นิพจน์ทั่วไปโดยไม่ต้องใส่เครื่องหมายคำพูด ฯลฯ

ตรวจสอบว่าสตริงเริ่มต้นด้วย 'ABC':

preg_match('/^ABC/', $myString); // "^" here means beginning of string

ลงท้ายด้วย 'ABC':

preg_match('/ABC$/', $myString); // "$" here means end of string

ในกรณีที่เรียบง่ายของฉันฉันต้องการตรวจสอบว่าสตริงลงท้ายด้วยเครื่องหมายทับ:

preg_match('#/$#', $myPath);   // Use "#" as delimiter instead of escaping slash

ข้อดี: เนื่องจากสั้นและง่ายมากคุณจึงไม่จำเป็นต้องกำหนดฟังก์ชั่น (เช่นendsWith()) ดังที่แสดงไว้ด้านบน

แต่อีกครั้ง - นี่ไม่ใช่วิธีแก้ปัญหาสำหรับทุกกรณีเพียงแค่นี้เท่านั้น


คุณไม่จำเป็นต้องเขียนโค้ดสตริง regex สามารถเป็นแบบไดนามิก
Ryan

2
@ ตนเองจริง แต่ถ้าสตริงไม่ hardcoded คุณต้องหนีมัน ขณะนี้มี 2 คำตอบสำหรับคำถามนี้ที่ทำ นี่เป็นเรื่องง่าย แต่มันซับซ้อนรหัสเพียงเล็กน้อย ดังนั้นประเด็นของฉันคือสำหรับกรณีที่ง่ายมากซึ่งเป็นไปได้ที่การเข้ารหัสแบบแข็งคุณสามารถทำให้มันง่าย
noamtm

1
คุณไม่จำเป็นต้องหลบหนีจากสแลชคุณสามารถใส่ regex ในตัวละครอื่น ๆ เช่น@เพื่อไม่ให้สแลช ( /) ไม่ต้องหลบหนี ดูตัวอย่างที่ 3 ที่นี่: php.net/manual/en/function.preg-match.php
cjbarth

ขอบคุณ @cjbarth เปลี่ยนคำตอบของฉันตาม BTW, "#" เป็นตัวอย่างที่ให้ไว้ในphp.net/manual/en/regexp.reference.delimiters.phpเมื่อจัดการกับสแลช
noamtm

23

หากความเร็วเป็นสิ่งสำคัญสำหรับคุณลองใช้ (ฉันเชื่อว่านี่เป็นวิธีที่เร็วที่สุด)

ใช้งานได้กับสตริงเท่านั้นและถ้า $ haystack มีเพียง 1 ตัวอักษร

function startsWithChar($needle, $haystack)
{
   return ($needle[0] === $haystack);
}

function endsWithChar($needle, $haystack)
{
   return ($needle[strlen($needle) - 1] === $haystack);
}

$str='|apples}';
echo startsWithChar($str,'|'); //Returns true
echo endsWithChar($str,'}'); //Returns true
echo startsWithChar($str,'='); //Returns false
echo endsWithChar($str,'#'); //Returns false

1
นี่อาจเป็นคำตอบที่มีประสิทธิภาพมากที่สุดเพราะไม่ได้ใช้ฟังก์ชั่นพิเศษใด ๆ เพียงแค่สตริงปกติ ...

มันควรจะตรวจสอบว่าสตริงมีอักขระอย่างน้อยหนึ่งตัวและมีการสลับพารามิเตอร์สองตัว
a1an

1
ความคิดสร้างสรรค์ เข็มที่มีฟาง BTW มีบางอย่างที่น่าเกลียดด้วย: endsWithChar('','x')แต่ผลลัพธ์ที่ถูกต้อง
Tino

18

ต่อไปนี้เป็นฟังก์ชันที่ไม่แนะนำสตริงชั่วคราวซึ่งอาจเป็นประโยชน์เมื่อเข็มมีขนาดใหญ่มาก:

function startsWith($haystack, $needle)
{
    return strncmp($haystack, $needle, strlen($needle)) === 0;
}

function endsWith($haystack, $needle)
{
    return $needle === '' || substr_compare($haystack, $needle, -strlen($needle)) === 0;
}

2
+1 ทำงานตั้งแต่ PHP5.1 และ IMHO เป็นคำตอบที่ดีที่สุด แต่endsWidthควรทำreturn $needle==='' || substr_compare(... เพื่อให้ได้ผลตามที่คาดหวังไว้-strlen($needle)===0ซึ่งหากไม่มีการแก้ไขก็สามารถendsWith('a','')คืนได้false
Tino

@Tino ขอบคุณ ... ฉันรู้สึกว่าเป็นข้อผิดพลาดในsubstr_compare()จริงดังนั้นฉันได้เพิ่มการประชาสัมพันธ์การแก้ไขที่ :)
แจ็ค

3
การเรียกendsWith('', 'foo')ทริกเกอร์คำเตือน:“ substr_compare (): ตำแหน่งเริ่มต้นต้องไม่เกินความยาวสตริงเริ่มต้น” อาจเป็นข้อผิดพลาดอื่นsubstr_compare()แต่เพื่อหลีกเลี่ยงคุณต้องตรวจสอบล่วงหน้าเช่น ... || (strlen($needle) <= strlen($haystack) && substr_compare(...) === 0);
gx_

@gx_ ไม่จำเป็นต้องชะลอตัวด้วยรหัสเพิ่มเติม เพียงใช้return $needle === '' || @substr_compare(.. เพื่อระงับคำเตือนนี้
Tino

17

โซลูชั่น EndWith () ที่เร็วที่สุด:

# Checks if a string ends in a string
function endsWith($haystack, $needle) {
    return substr($haystack,-strlen($needle))===$needle;
}

เกณฑ์มาตรฐาน:

# This answer
function endsWith($haystack, $needle) {
    return substr($haystack,-strlen($needle))===$needle;
}

# Accepted answer
function endsWith2($haystack, $needle) {
    $length = strlen($needle);

    return $length === 0 ||
    (substr($haystack, -$length) === $needle);
}

# Second most-voted answer
function endsWith3($haystack, $needle) {
    // search forward starting from end minus needle length characters
    if ($needle === '') {
        return true;
    }
    $diff = \strlen($haystack) - \strlen($needle);
    return $diff >= 0 && strpos($haystack, $needle, $diff) !== false;
}

# Regex answer
function endsWith4($haystack, $needle) {
    return preg_match('/' . preg_quote($needle, '/') . '$/', $haystack);
}

function timedebug() {
    $test = 10000000;

    $time1 = microtime(true);
    for ($i=0; $i < $test; $i++) {
        $tmp = endsWith('TestShortcode', 'Shortcode');
    }
    $time2 = microtime(true);
    $result1 = $time2 - $time1;

    for ($i=0; $i < $test; $i++) {
        $tmp = endsWith2('TestShortcode', 'Shortcode');
    }
    $time3 = microtime(true);
    $result2 = $time3 - $time2;

    for ($i=0; $i < $test; $i++) {
        $tmp = endsWith3('TestShortcode', 'Shortcode');
    }
    $time4 = microtime(true);
    $result3 = $time4 - $time3;

    for ($i=0; $i < $test; $i++) {
        $tmp = endsWith4('TestShortcode', 'Shortcode');
    }
    $time5 = microtime(true);
    $result4 = $time5 - $time4;

    echo $test.'x endsWith: '.$result1.' seconds # This answer<br>';
    echo $test.'x endsWith2: '.$result4.' seconds # Accepted answer<br>';
    echo $test.'x endsWith3: '.$result2.' seconds # Second most voted answer<br>';
    echo $test.'x endsWith4: '.$result3.' seconds # Regex answer<br>';
    exit;
}
timedebug();

ผลลัพธ์มาตรฐาน:

10000000x endsWith: 1.5760900974274 seconds # This answer
10000000x endsWith2: 3.7102129459381 seconds # Accepted answer
10000000x endsWith3: 1.8731069564819 seconds # Second most voted answer
10000000x endsWith4: 2.1521229743958 seconds # Regex answer

3
+1 สำหรับการสละเวลาเพื่อเปรียบเทียบโซลูชันที่แตกต่างกัน คุณควรพูดถึง PHP เวอร์ชันที่คุณใช้ด้วยเนื่องจากการเพิ่มประสิทธิภาพจะทำเมื่อภาษาวิวัฒนาการ! ฉันได้เห็นการปรับปรุงอย่างมากในฟังก์ชั่นการเปรียบเทียบสตริงจาก PHP เวอร์ชันหนึ่งไปยังอีก :)
Christophe Deliens

1
echoing @ChristopheDeliens และคำขอของเขาเพื่อจัดเตรียมเวอร์ชัน PHP ฉันทำการทดสอบของคุณใน 7.3.2 และได้ผลลัพธ์ที่คล้ายกัน FWIW
Jeff

16

ฉันรู้ว่าสิ่งนี้เสร็จสิ้นแล้ว แต่คุณอาจต้องการดูstrncmpเนื่องจากให้คุณใส่ความยาวของสตริงเพื่อเปรียบเทียบกับดังนั้น:

function startsWith($haystack, $needle, $case=true) {
    if ($case)
        return strncasecmp($haystack, $needle, strlen($needle)) == 0;
    else
        return strncmp($haystack, $needle, strlen($needle)) == 0;
}    

คุณจะทำอย่างไรกับสิ่งนี้
mpen

@ Mark - คุณสามารถดูคำตอบที่ยอมรับได้ แต่ฉันชอบที่จะใช้ strncmp เป็นหลักเพราะฉันคิดว่ามันปลอดภัยกว่า
James Black

ฉันหมายถึงกับ strncmp โดยเฉพาะ คุณไม่สามารถระบุออฟเซ็ต นั่นหมายความว่าฟังก์ชัน EndWith ของคุณจะต้องใช้วิธีอื่นทั้งหมด
mpen

@ Mark - สำหรับปลายทางด้วยฉันจะใช้ strrpos ( php.net/manual/en/function.strrpos.php ) แต่โดยทั่วไปเมื่อใดก็ตามที่คุณไปใช้ strcmp strncmp อาจเป็นตัวเลือกที่ปลอดภัยกว่า
James Black

11

คุณสามารถใช้strposและstrrpos

$bStartsWith = strpos($sHaystack, $sNeedle) == 0;
$bEndsWith = strrpos($sHaystack, $sNeedle) == strlen($sHaystack)-strlen($sNeedle);

1
คุณควรจะใช้เท่ากับสามที่นี่strpos($sHaystack, $sNeedle) == 0เช่นนี้strpos($sHaystack, $sNeedle) === 0? ผมเห็นข้อผิดพลาดเมื่อประเมินfalse == 0 true
Kalyan

11

นี่เป็นเวอร์ชันที่ปลอดภัยแบบมัลติไบต์ของคำตอบที่ยอมรับใช้งานได้ดีกับสตริง UTF-8

function startsWith($haystack, $needle)
{
    $length = mb_strlen($needle, 'UTF-8');
    return (mb_substr($haystack, 0, $length, 'UTF-8') === $needle);
}

function endsWith($haystack, $needle)
{
    $length = mb_strlen($needle, 'UTF-8');
    return $length === 0 ||
        (mb_substr($haystack, -$length, $length, 'UTF-8') === $needle);
}

2
ฉันค่อนข้างแน่ใจว่านี่เป็นเพียงการเสียของ CPU สิ่งที่คุณต้องตรวจสอบสำหรับ StarstWith และ EndsWith เป็นเพียงการตรวจสอบว่าไบต์ตรงกันและนั่นคือสิ่งที่คำตอบที่ยอมรับได้ทำ 1 นี้เสียเวลาในการคำนวณจำนวนของ utf8 ตัวอักษรของเข็มและตำแหน่งของตัวอักษร n'th utf8 ของกองหญ้าคือ .. ฉันคิดว่าโดยไม่ต้องแน่ใจ 100% นี่เป็นเพียงของเสียซีพียู คุณสามารถสร้างกรณีทดสอบจริงขึ้นมาซึ่งคำตอบที่ยอมรับได้ล้มเหลวได้หรือไม่?
hanshenrik

2
@ hanshenrik - มันอาจเกิดขึ้น btw ในกรณีที่หายากมากเมื่อคุณค้นหาสตริงที่มีไบต์เดียวกันกับ UTF8 แต่ครึ่งหนึ่งของอักขระสุดท้ายหายไป เช่นเดียวกับคุณมี unicode C5 91 (ตัวอักษร "ő") และคุณมองหา C5 (ตัวอักษร "Å") มันไม่ควรให้การแข่งขัน ในอีกทางหนึ่งแน่นอนว่าทำไมคุณถึงค้นหาเฮย์สแต็คสำหรับเข็มที่ไม่ใช่ UTF ... แต่สำหรับการตรวจสอบกระสุนคุณต้องพิจารณาความเป็นไปได้
dkellner

ในstartsWithมันควรจะเป็น$length = mb_strlen($needle, 'UTF-8');
โทมัส Kekeisen

2
@ThomasKekeisen ขอบคุณแก้ไขมัน
Vahid Amiri

8

สั้นและง่ายต่อการเข้าใจหนึ่งสมุทรโดยไม่ต้องแสดงออกปกติ

startsWith () ตรงไปข้างหน้า

function startsWith($haystack, $needle) {
   return (strpos($haystack, $needle) === 0);
}

endsWith () ใช้ strrev แฟนซีเล็กน้อยและช้า ():

function endsWith($haystack, $needle) {
   return (strpos(strrev($haystack), strrev($needle)) === 0);
}

@FrancescoMM: strpos ไม่ใช่ "เครื่องมือที่เหมาะสม" ... ทำไมล่ะ? "เครื่องมือที่เหมาะสม" คืออะไร? แก้ไข:ฉันอ่านคำตอบของคุณด้านล่าง ฉันคิดว่าการเขียนโปรแกรมเป็นเหมือนการประดิษฐ์โดยใช้ทรัพยากรที่คุณมี .. ดังนั้นจึงไม่มีอะไรถูกหรือผิด ... แค่ทำงานหรือไม่ทำงาน ... ประสิทธิภาพเป็นรอง
Fr0zenFyr

"เพราะเป็นเครื่องมือสำหรับการค้นหาไม่ใช่เพื่อการเปรียบเทียบ" Cit Aristoteles
FrancescoMM

7

มุ่งเน้นไปที่ startswith ถ้าคุณแน่ใจว่าสตริงไม่ว่างเพิ่มการทดสอบในตัวแรกก่อนที่จะทำการเปรียบเทียบ strlen และอื่น ๆ เพิ่มความเร็วขึ้นเล็กน้อย:

function startswith5b($haystack, $needle) {
    return ($haystack{0}==$needle{0})?strncmp($haystack, $needle, strlen($needle)) === 0:FALSE;
}

มันเร็วกว่า (20% -30%) การเพิ่มการทดสอบถ่านอื่น ๆ เช่น $ haystack {1} === $ needle {1} ดูเหมือนจะไม่เร่งความเร็วมากนักแม้แต่อาจช้าลง

===ดูเหมือนว่าเร็วกว่า== ผู้ดำเนินการตามเงื่อนไข(a)?b:cดูเหมือนว่าเร็วกว่าif(a) b; else c;


สำหรับผู้ถามว่า "ทำไมไม่ใช้ strpos?" เรียกโซลูชันอื่น ๆ "งานที่ไม่จำเป็น"


strpos นั้นเร็ว แต่มันไม่ใช่เครื่องมือที่เหมาะสมสำหรับงานนี้

เพื่อทำความเข้าใจต่อไปนี้เป็นตัวอย่างเล็กน้อย:

Search a12345678c inside bcdefga12345678xbbbbb.....bbbbba12345678c

คอมพิวเตอร์ "ภายใน" อะไร?

    With strccmp, etc...

    is a===b? NO
    return false



    With strpos

    is a===b? NO -- iterating in haysack
    is a===c? NO
    is a===d? NO
    ....
    is a===g? NO
    is a===g? NO
    is a===a? YES
    is 1===1? YES -- iterating in needle
    is 2===3? YES
    is 4===4? YES
    ....
    is 8===8? YES
    is c===x? NO: oh God,
    is a===1? NO -- iterating in haysack again
    is a===2? NO
    is a===3? NO
    is a===4? NO
    ....
    is a===x? NO
    is a===b? NO
    is a===b? NO
    is a===b? NO
    is a===b? NO
    is a===b? NO
    is a===b? NO
    is a===b? NO
    ...
    ... may many times...
    ...
    is a===b? NO
    is a===a? YES -- iterating in needle again
    is 1===1? YES
    is 2===3? YES
    is 4===4? YES
    is 8===8? YES
    is c===c? YES YES YES I have found the same string! yay!
    was it at position 0? NOPE
    What you mean NO? So the string I found is useless? YEs.
    Damn.
    return false

สมมติว่า strlen ไม่ได้วนซ้ำทั้งสตริง (แต่ถึงแม้ในกรณีนั้น) มันไม่สะดวกเลย


มีเพียงความเร็วถ้าตัวละครตัวแรกแตกต่างกัน
Ja͢ck

2
@ แจ็คใช่แน่นอนความคิดก็คือสถิติที่เกิดขึ้นดังนั้นการเร่งความเร็วโดยทั่วไปคือ 20% -30% จากชุดทดสอบทั้งหมด (รวมถึงกรณีที่ไม่แตกต่างกัน) คุณได้รับมากเมื่อพวกเขาแตกต่างกันและหลวมน้อยมากเมื่อพวกเขาไม่ได้ โดยเฉลี่ยแล้วคุณจะได้รับ 30% (แตกต่างกันไปขึ้นอยู่กับชุด แต่ส่วนใหญ่คุณจะได้รับความเร็วในการทดสอบขนาดใหญ่)
FrancescoMM

"แต่มันไม่ใช่เครื่องมือที่เหมาะสมสำหรับงานนี้" ... การอ้างอิงใด ๆ
Fr0zenFyr

1
WTF ฉันระบุขั้นตอนทั้งหมดด้านล่างที่ควรอ้างอิงมากกว่านั้น คุณจะใช้ฟังก์ชั่นที่ค้นหาจนถึงจุดสิ้นสุดของสตริงเพื่อบอกคุณว่าตัวละครกำปั้นไม่ใช่ 'a' หรือไม่? ใครที่สน? มันไม่ใช่เครื่องมือที่เหมาะสมเพราะเป็นเครื่องมือสำหรับการค้นหาไม่ใช่เพื่อการเปรียบเทียบไม่มีความจำเป็นที่จะต้องอ้าง Aristoteles เพื่อระบุสิ่งที่ชัดเจน!
FrancescoMM

6

ฉันหวังว่าคำตอบด้านล่างอาจมีประสิทธิภาพและเรียบง่าย:

$content = "The main string to search";
$search = "T";
//For compare the begining string with case insensitive. 
if(stripos($content, $search) === 0) echo 'Yes';
else echo 'No';

//For compare the begining string with case sensitive. 
if(strpos($content, $search) === 0) echo 'Yes';
else echo 'No';

//For compare the ending string with case insensitive. 
if(stripos(strrev($content), strrev($search)) === 0) echo 'Yes';
else echo 'No';

//For compare the ending string with case sensitive. 
if(strpos(strrev($content), strrev($search)) === 0) echo 'Yes';
else echo 'No';

6

ฉันมักจะจบลงด้วยการใช้ห้องสมุดอย่างเช่นขีดล่าง - php ในปัจจุบัน

require_once("vendor/autoload.php"); //use if needed
use Underscore\Types\String; 

$str = "there is a string";
echo( String::startsWith($str, 'the') ); // 1
echo( String::endsWith($str, 'ring')); // 1   

ห้องสมุดเต็มไปด้วยฟังก์ชั่นที่มีประโยชน์อื่น ๆ


6

คำตอบโดยmpenเป็นอย่างไม่น่าเชื่อ แต่โชคไม่ดีที่มาตรฐานมีให้มีการกำกับดูแลที่สำคัญมากและเป็นอันตราย

เนื่องจากทุกไบต์ในเข็มและฟางเป็นสุ่มอย่างสมบูรณ์ความน่าจะเป็นที่เข็มคู่กองหญ้าจะแตกต่างกันในไบต์แรกคือ 99.609375% ซึ่งหมายความว่าโดยเฉลี่ยประมาณ 99609 ของ 100,000 คู่จะแตกต่างกันในไบต์แรก . ในคำอื่น ๆ มาตรฐานจะลำเอียงอย่างหนักต่อstartswithการใช้งานที่ตรวจสอบไบต์แรกอย่างชัดเจนเช่นstrncmp_startswith2ไม่

หากลูปการสร้างการทดสอบถูกนำไปใช้แทนดังนี้:

echo 'generating tests';
for($i = 0; $i < 100000; ++$i) {
    if($i % 2500 === 0) echo '.';

    $haystack_length = random_int(1, 7000);
    $haystack = random_bytes($haystack_length);

    $needle_length = random_int(1, 3000);
    $overlap_length = min(random_int(0, $needle_length), $haystack_length);
    $needle = ($needle_length > $overlap_length) ?
        substr($haystack, 0, $overlap_length) . random_bytes($needle_length - $overlap_length) :
        substr($haystack, 0, $needle_length);

    $test_cases[] = [$haystack, $needle];
}
echo " done!<br />";

ผลการทดสอบเกณฑ์มาตรฐานบอกเล่าเรื่องราวที่แตกต่างกันเล็กน้อย:

strncmp_startswith: 223.0 ms
substr_startswith: 228.0 ms
substr_compare_startswith: 238.0 ms
strncmp_startswith2: 253.0 ms
strpos_startswith: 349.0 ms
preg_match_startswith: 20,828.7 ms

แน่นอนว่าเบนช์มาร์กนี้อาจไม่ได้มีความเป็นกลางอย่างสมบูรณ์ แต่เป็นการทดสอบประสิทธิภาพของอัลกอริทึมเมื่อได้รับเข็มที่ตรงกันบางส่วนเช่นกัน


5

ในระยะสั้น:

function startsWith($str, $needle){
   return substr($str, 0, strlen($needle)) === $needle;
}

function endsWith($str, $needle){
   $length = strlen($needle);
   return !$length || substr($str, - $length) === $needle;
}

5

เพียงแค่คำแนะนำ:

function startsWith($haystack,$needle) {
    if($needle==="") return true;
    if($haystack[0]<>$needle[0]) return false; // ------------------------- speed boost!
    return (0===substr_compare($haystack,$needle,0,strlen($needle)));
}

บรรทัดพิเศษนั้นการเปรียบเทียบอักขระตัวแรกของสตริงสามารถทำให้ตัวพิมพ์ใหญ่กลับมาได้ในทันทีดังนั้นจึงทำให้การเปรียบเทียบของคุณนั้นเร็วขึ้นมาก (เร็วขึ้น 7 เท่าเมื่อฉันวัด) ในกรณีจริงคุณไม่ต้องจ่ายเงินตามประสิทธิภาพสำหรับสายเดี่ยวนั้นฉันคิดว่ามันคุ้มค่า (ในทางปฏิบัติเมื่อคุณทดสอบสตริงจำนวนมากสำหรับก้อนเริ่มต้นที่เฉพาะเจาะจงการเปรียบเทียบส่วนใหญ่จะล้มเหลวเนื่องจากในกรณีทั่วไปคุณกำลังมองหาบางอย่าง)


2
ข้อผิดพลาดในรหัสของคุณ: startsWith("123", "0")ให้true
Tino

เกิดอะไรขึ้นการตรวจสอบ $ ที่เกิดขึ้น ขออภัย! (แค่ต้องการแสดงแนวคิดในบรรทัดที่ 3)
dkellner

4

substrฟังก์ชั่นสามารถกลับfalseในกรณีพิเศษมากมายเพื่อให้ที่นี่เป็นรุ่นของฉันซึ่งเกี่ยวข้องกับปัญหาเหล่านี้:

function startsWith( $haystack, $needle ){
  return $needle === ''.substr( $haystack, 0, strlen( $needle )); // substr's false => empty string
}

function endsWith( $haystack, $needle ){
  $len = strlen( $needle );
  return $needle === ''.substr( $haystack, -$len, $len ); // ! len=0
}

การทดสอบ ( trueหมายถึงดี):

var_dump( startsWith('',''));
var_dump( startsWith('1',''));
var_dump(!startsWith('','1'));
var_dump( startsWith('1','1'));
var_dump( startsWith('1234','12'));
var_dump(!startsWith('1234','34'));
var_dump(!startsWith('12','1234'));
var_dump(!startsWith('34','1234'));
var_dump('---');
var_dump( endsWith('',''));
var_dump( endsWith('1',''));
var_dump(!endsWith('','1'));
var_dump( endsWith('1','1'));
var_dump(!endsWith('1234','12'));
var_dump( endsWith('1234','34'));
var_dump(!endsWith('12','1234'));
var_dump(!endsWith('34','1234'));

นอกจากนี้substr_compareฟังก์ชั่นยังน่าดู http://www.php.net/manual/en/function.substr-compare.php



4

ฉันจะทำเช่นนี้

     function startWith($haystack,$needle){
              if(substr($haystack,0, strlen($needle))===$needle)
              return true;
        }

  function endWith($haystack,$needle){
              if(substr($haystack, -strlen($needle))===$needle)
              return true;
        }

ลืมส่งคืน false หากไม่ตรงกัน ผิดพลาดไม่ถูกต้องเช่นเดียวกับค่าตอบแทนของฟังก์ชั่นไม่ควร 'สันนิษฐาน' แต่ฉันรู้ว่าสิ่งที่คุณจะไปอย่างน้อยเมื่อเทียบกับคำตอบอื่น ๆ
Spoo

3

ตามคำตอบของ James Black ต่อไปนี้เป็นเวอร์ชั่นสุดท้ายที่มี:

function startsWith($haystack, $needle, $case=true) {
    if ($case)
        return strncmp($haystack, $needle, strlen($needle)) == 0;
    else
        return strncasecmp($haystack, $needle, strlen($needle)) == 0;
}

function endsWith($haystack, $needle, $case=true) {
     return startsWith(strrev($haystack),strrev($needle),$case);

}

หมายเหตุ: ฉันได้สลับส่วน if-else สำหรับฟังก์ชั่น startsWith ของ James Black เพราะ strncasecmp เป็นรุ่นที่ไม่ตรงตามตัวพิมพ์ของ strncmp


2
โปรดทราบว่าโฆษณาstrrev()นั้นสร้างสรรค์แต่มีค่าใช้จ่ายสูงโดยเฉพาะอย่างยิ่งถ้าคุณมีคำพูด ... 100Kb
Alexis Wilke

ใช้===แทน==เพื่อความแน่ใจ 0เท่ากับสิ่งต่างๆมากมายใน PHP
nawfal

3

ทำไมไม่ต่อไปนี้

//How to check if a string begins with another string
$haystack = "valuehaystack";
$needle = "value";
if (strpos($haystack, $needle) === 0){
    echo "Found " . $needle . " at the beginning of " . $haystack . "!";
}

เอาท์พุท:

พบค่าที่จุดเริ่มต้นของ valuehaystack!

โปรดจำไว้ว่าstrposจะส่งคืนค่าเท็จหากไม่พบเข็มในกองหญ้าและจะคืนค่า 0 ถ้าและเฉพาะในกรณีที่เข็มถูกค้นพบที่ดัชนี 0 (จุดเริ่มต้นของ AKA)

และนี่คือจุดสิ้นสุดด้วย:

$haystack = "valuehaystack";
$needle = "haystack";

//If index of the needle plus the length of the needle is the same length as the entire haystack.
if (strpos($haystack, $needle) + strlen($needle) === strlen($haystack)){
    echo "Found " . $needle . " at the end of " . $haystack . "!";
}

ในสถานการณ์นี้ไม่จำเป็นต้องมีฟังก์ชั่น startsWith () เป็น

(strpos($stringToSearch, $doesItStartWithThis) === 0)

จะส่งกลับจริงหรือเท็จอย่างถูกต้อง

ดูเหมือนว่ามันไม่ง่ายเลยที่มันมีฟังก์ชั่นเสริมทั้งหมดวิ่งพล่านอยู่ที่นี่


3
ดูเหมือนว่าแปลกถ้าคุณกำลังค้นหา "xy" ในสตริง "abcdefghijklmxyz" แทนที่จะเปรียบเทียบ "x" กับ "a" และส่งกลับค่า FALSE คุณดูอักขระทุกตัวจาก "a" ถึง "m" จากนั้นท้ายค้นหา "xy" ภายในสตริงและสุดท้ายคุณกลับ FALSE เพราะตำแหน่งของมันไม่เป็นศูนย์! นี่คือสิ่งที่คุณกำลังทำและมันแปลกและน่ากลัวกว่าฟังก์ชั่นอาละวาดอื่น ๆ ที่นี่
FrancescoMM

ความเรียบง่ายอยู่ในการพิมพ์ไม่ใช่ตรรกะ
Kade Hafen

มันไม่ได้เป็นตรรกะมากนัก แต่เป็นการเพิ่มประสิทธิภาพที่เป็นไปได้ที่ Francsco ชี้ให้เห็น การใช้strpos()จะช้ายกเว้นเมื่อจับคู่กัน strncmp()จะดีกว่ามากในกรณีนี้
Alexis Wilke

เมื่อคุณทำฟังก์ชั่นระดับต่ำเช่นนี้คุณมักจะต้องการโซลูชันที่ปรับความเร็วได้อย่างเหมาะสมที่สุดไม่ว่าจะซับซ้อนเพียงใดซึ่งจะเรียกว่าเป็นล้านครั้ง ไมโครวินาทีทุกครั้งที่คุณได้รับหรือแพ้ที่นี่จะสร้างความแตกต่างอย่างแท้จริง ดังนั้นปรับแต่งนรกให้ดีกว่า (แล้วลืมความซับซ้อนตอนนี้คุณมีฟังก์ชั่น) แทนที่จะไปดูและเสียเวลาไปกับความน่ากลัวในเวลาต่อมาเมื่อคุณไม่รู้ว่ามีอะไรผิดปกติเกิดขึ้น ลองนึกภาพการตรวจสอบสตริง 2GB ที่ไม่ตรงกัน
dkellner

3

คำตอบก่อนหน้านี้หลายคำก็ใช้ได้เช่นกัน อย่างไรก็ตามนี่อาจเป็นระยะสั้นที่สุดเท่าที่คุณสามารถทำได้และมีสิ่งที่คุณต้องการ คุณเพียงแค่ระบุว่าคุณต้องการให้ 'คืนความจริง' ดังนั้นฉันจึงได้รวมวิธีแก้ปัญหาที่ส่งกลับบูลีนจริง / เท็จและข้อความจริง / เท็จ

// boolean true/false
function startsWith($haystack, $needle)
{
    return strpos($haystack, $needle) === 0 ? 1 : 0;
}

function endsWith($haystack, $needle)
{
    return stripos($haystack, $needle) === 0 ? 1 : 0;
}


// textual true/false
function startsWith($haystack, $needle)
{
    return strpos($haystack, $needle) === 0 ? 'true' : 'false';
}

function endsWith($haystack, $needle)
{
    return stripos($haystack, $needle) === 0 ? 'true' : 'false';
}

จริง อย่างไรก็ตามปีเตอร์กำลังขอฟังก์ชั่นที่จะทำงานกับสตริงอักขระ อย่างไรก็ตามฉันได้อัปเดตคำตอบเพื่อเอาใจคุณ
wynshaft

หลังจากแก้ไขวิธีการแก้ปัญหาของคุณตอนนี้ล้าสมัยอย่างสมบูรณ์ มันกลับมา'true'และ'false'เป็นสตริงซึ่งทั้งสองtrueอยู่ในความรู้สึกแบบบูล มันเป็นรูปแบบที่ดีสำหรับบางสิ่งบางอย่างเช่นunderhanded.xcott.comแม้ว่า;)
Tino

ปีเตอร์เพิ่งบอกว่าเขาต้องการให้มันกลับมา 'จริง' ดังนั้นฉันคิดว่าฉันจะกลับสิ่งที่เขาขอ ฉันได้เพิ่มทั้งสองเวอร์ชันในกรณีที่ไม่ใช่สิ่งที่เขาต้องการ
wynshaft

2

คุณยังสามารถใช้นิพจน์ทั่วไป:

function endsWith($haystack, $needle, $case=true) {
  return preg_match("/.*{$needle}$/" . (($case) ? "" : "i"), $haystack);
}

3
$ preg_quote($needle, '/')เข็มควรจะหนีไปกับ
Timo Tijhof

2

ไม่มีการคัดลอกและไม่มีการวนซ้ำ:

function startsWith(string $string, string $start): bool
{
    return strrpos($string, $start, - strlen($string)) !== false;
}

function endsWith(string $string, string $end): bool
{
    return ($offset = strlen($string) - strlen($end)) >= 0 
    && strpos($string, $end, $offset) !== false;
}

ควรเร็วกว่าการติดตั้งของ MrHus มาก! ฉันอาจจะมาตรฐาน
hanshenrik

1

นี่เป็นวิธีการแก้ปัญหาที่มีประสิทธิภาพสำหรับ PHP 4 คุณอาจจะได้รับผลเร็วขึ้นถ้าอยู่กับ PHP 5 โดยใช้แทนsubstr_comparestrcasecmp(substr(...))

function stringBeginsWith($haystack, $beginning, $caseInsensitivity = false)
{
    if ($caseInsensitivity)
        return strncasecmp($haystack, $beginning, strlen($beginning)) === 0;
    else
        return strncmp($haystack, $beginning, strlen($beginning)) === 0;
}

function stringEndsWith($haystack, $ending, $caseInsensitivity = false)
{
    if ($caseInsensitivity)
        return strcasecmp(substr($haystack, strlen($haystack) - strlen($ending)), $haystack) === 0;
    else
        return strpos($haystack, $ending, strlen($haystack) - strlen($ending)) !== false;
}

0

คุณสามารถใช้ฟังก์ชั่นfnmatchสำหรับสิ่งนี้

// Starts with.
fnmatch('prefix*', $haystack);
// Ends with.
fnmatch('*suffix', $haystack);

คำเตือนไม่ใช่ไบนารีที่ปลอดภัยและไม่ปลอดภัยแม้แต่กับเข็มที่มี wildcards = /
hanshenrik
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.