When you came to this page, you may have been looking for something a little simpler: A function that can check if a small string exists within a larger string starting at a particular index. Using substr_compare() for this can leave your code messy, because you need to check that your string is long enough (to avoid the warning), manually specify the length of the short string, and like many of the string functions, perform an integer comparison to answer a true/false question.
I put together a simple function to return true if $str exists within $mainStr. If $loc is specified, the $str must begin at that index. If not, the entire $mainStr will be searched.
<?php
function contains_substr($mainStr, $str, $loc = false) {
if ($loc === false) return (strpos($mainStr, $str) !== false);
if (strlen($mainStr) < strlen($str)) return false;
if (($loc + strlen($str)) > strlen($mainStr)) return false;
return (strcmp(substr($mainStr, $loc, strlen($str)), $str) == 0);
}
?>substr_compare
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
substr_compare
Референца за `function.substr-compare.php` со подобрена типографија и навигација.
substr_compare
класата mysqli_driver
substr_compare — Бинарно безбедно споредување на два низа од одредена позиција, до должина на знаци
= NULL
string
$haystack,string
$needle,int
$offset,?int
$length = null,bool
$case_insensitive = false): int
substr_compare() compares haystack
од позиција offset with needle
до length characters.
Параметри
haystack-
Главниот низ што се споредува.
needle-
Секундарниот низ што се споредува.
offset-
Почетната позиција за споредување. Ако е негативна, броењето започнува од крајот на низата.
length-
Должината на споредувањето. Стандардната вредност е најголемата од должината на
needleспоредено со должината наhaystackминусoffset. case_insensitive-
Враќа
case_insensitiveistrue, споредувањето не е чувствително на големи и мали букви.
Вратени вредности
Враќа вредност помала од 0 ако string1
е помала од string2; вредност поголема од 0 ако string1 е поголемо од
string2Препорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во 0 ако се еднакви. Не може сигурно да се изведе никакво посебно значење од вредноста освен нејзиниот знак.
Враќа offset е еднакво на (пред PHP 7.2.18, 7.3.5) или поголемо од должината на haystack, или
length е поставено и е помало од 0,
substr_compare() печати предупредување и враќа
false.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 8.2.0 |
Оваа функција веќе не е загарантирана да враќа
strlen($string1) - strlen($string2) кога должините на низите не се еднакви, но сега може да враќа -1 or
1 instead.
|
| 8.0.0 |
length сега е null.
|
| 7.2.18, 7.3.5 |
offset може сега да биде еднакво на должината на haystack.
|
Примери
ако е овозможен колекторот за отпадоци, substr_compare() example
<?php
echo substr_compare("abcde", "bc", 1, 2), PHP_EOL; // 0
echo substr_compare("abcde", "de", -2, 2), PHP_EOL; // 0
echo substr_compare("abcde", "bcg", 1, 2), PHP_EOL; // 0
echo substr_compare("abcde", "BC", 1, 2, true), PHP_EOL; // 0
echo substr_compare("abcde", "bc", 1, 3), PHP_EOL; // 1
echo substr_compare("abcde", "cd", 1, 2), PHP_EOL; // -1
echo substr_compare("abcde", "abc", 5, 1), PHP_EOL; // -1
?>Белешки од корисници 3 белешки
This function efficiently implements checks for strings beginning or ending with other strings:
<?php
function str_begins($haystack, $needle) {
return 0 === substr_compare($haystack, $needle, 0, strlen($needle));
}
function str_ends($haystack, $needle) {
return 0 === substr_compare($haystack, $needle, -strlen($needle));
}
var_dump(str_begins('http://example.com', 'https://'));
?>
Note that these are not multi-byte character set aware.Take note of the `length` parameter: "The default value is the largest of the length of the str compared to the length of main_str less the offset."
This is *not* the length of str as you might (I always) expect, so if you leave it out, you'll get unexpected results. Example:
<?php
$hash = '$5$lalalalalalalala$crypt.output.here';
var_dump(substr_compare($hash, '$5$', 0)); # int(34)
var_dump(substr_compare($hash, '$5$', 0, 3)); # int(0)
var_dump(PHP_VERSION); # string(6) "5.3.14"
?>