substr_compare
COMPARE two strings from an offset, up to length characters.
If $offset < 0 the counting starts from the end of the STRING.
The default $length value is the largest of the length of the $str compared to the length of $main_str minus $offset.
This function returns a NEGATIVE value if $main_str from position $offset is LESS than $str length.
This function returns a POSITIVE value if $main_str from position $offset is GREATER than $str length.
If $offset is EQUAL to, (prior to PHP 7.2.18, 7.3.5), or GREATER than the length of $main_str, or the $length is set and is less than 0, (or, prior to PHP 5.5.11, less than 1) this function prints a WARNING and returns FALSE.
This function is binary-safe
In PHP, some functions are marked as binary-safe, it means that the functions works correctly even when you pass binary data.
<?php
int substr_compare ( str $main_str ,
str $str ,
int $offset [,
int $length [,
bool $case_insensitivity = FALSE ]] )
where,
$main_str = The main STRING being compared
$str = The secondary STRING being compared
$offset = The offset where to start counting
$length = The length of the comparisson
$case_insensitivity = To control the comparisson case
( SEE the TABLE )
?>
$main_str
The main STRING being compared.
$str
The secondary STRING being compared.
$offset
The $offset where to start counting.
$length
The $length where to start the comparisson.
$case_insensitivity
VALUE |
MEANING |
FALSE |
The comparisson will be case sensitive. |
TRUE |
The comparisson will be case insensitive. |
ed48 |
EXERCISE
<table width="100%" cellspacing="5"
cellpadding="5" border="1">
<tbody><tr>
<td width="12%">$offset</td>
<td width="9%">RETURNS</td>
<td width="56%">SECTION of $main_str
from $offset to $length</td>
<td width="23%">$str</td>
</tr>
<?php
$main_str01 = "NOT CONSTITUTIONAL";
$str01 = "CONSTITUTIONAL";
// UPPERCASE
for ($offset01 = 0;
$offset01 <= strlen($main_str01) - 1;
$offset01++)
{
$comp01 = substr_compare($main_str01, $str01, $offset01);
// Without consider the length of $str01
echo '<tr><td>' . $offset01 . '</td><td>' . $comp01 .
'</td><td>' . substr($main_str01, $offset01) .
'</td><td>' . $str01 . '</td></tr>';
}
?>
<tr><td colspan="4">ed48</td></tr></tbody></table>
EXERCISE
<table width="100%" cellspacing="5"
cellpadding="5" border="1">
<tbody><tr>
<td width="12%">$offset</td>
<td width="9%">RETURNS</td>
<td width="56%">SECTION of $main_str
from $offset to $length</td>
<td width="23%">$str</td>
</tr>
<?php
$main_str02 = "NOT CONSTITUTIONAL";
$str02 = "CONSTITUTIONAL";
// UPPERCASE
for ($offset02 = 0;
$offset02 <= strlen($main_str02) - 1;
$offset02++)
{
$comp02 = substr_compare($main_str02, $str02,
$offset02, strlen($str02));
// Considering the length of $str02
echo '<tr><td>' . $offset02 . '</td><td>' . $comp02 .
'</td><td>' . substr($main_str02, $offset02) .
'</td><td>' . $str02 . '</td></tr>';
}
?>
<tr><td colspan="4">ed48</td></tr></tbody></table>
EXERCISE
<table width="100%" cellspacing="5"
cellpadding="5" border="1">
<tbody><tr>
<td width="12%">$offset</td>
<td width="9%">RETURNS</td>
<td width="56%">SECTION of $main_str
from $offset to $length</td>
<td width="23%">$str</td>
</tr>
<?php
$main_str03 = "NOT CONSTITUTIONAL";
$str03 = "constitutional";
// lowercase
for ($offset03 = 0;
$offset03 <= strlen($main_str03) - 1;
$offset03++)
{
$comp03 = substr_compare($main_str03,
$str03, $offset03);
// Without consider the length of $str03
echo '<tr><td>' . $offset03 . '</td><td>' . $comp03 .
'</td><td>' . substr($main_str03, $offset03) .
'</td><td>' . $str03 . '</td></tr>';
}
?>
<tr><td colspan="4">ed48</td></tr></tbody></table>
EXERCISE
<table width="100%" cellspacing="5"
cellpadding="5" border="1">
<tbody><tr>
<td width="12%">$offset</td>
<td width="9%">RETURNS</td>
<td width="56%">SECTION of $main_str
from $offset to $length</td>
<td width="23%">$str</td>
</tr>
<?php
$main_str04 = "Não é sempre que
se pode confiar em alguém!";
/* It is not always
you can trust someone! */
// May experience problems
// in languages other than English
$str04 = "SEMPRE";
// UPPERCASE
for ($offset04 = 0;
$offset04 <= strlen($main_str04) - 1;
$offset04++)
{
$comp04 = substr_compare($main_str04,
$str04, $offset04);
// Without consider the length of $str04
echo '<tr><td>' . $offset04 . '</td><td>' . $comp04 .
'</td><td>' . substr($main_str04, $offset04) .
'</td><td>' . $str04 . '</td></tr>';
}
?>
<tr><td colspan="4">ed48</td></tr></tbody></table>
EXERCISE
<?php
var_dump(substr_compare("abcde", "df", -2) < 0);
echo '<br><br>';
var_dump(substr_compare("abcde", "df", -2, null) < 0);
echo '<br><br>';
var_dump(substr_compare("abcde", "bc", 1, 2));
echo '<br><br>';
var_dump(substr_compare("abcde", "bcg", 1, 2));
echo '<br><br>';
var_dump(substr_compare("abcde", "BC", 1, 2, true));
echo '<br><br>';
var_dump(substr_compare("abcde", "bc", 1, 3) > 0);
echo '<br><br>';
var_dump(substr_compare("abcde", "cd", 1, 2) < 0);
echo '<br><br>';
var_dump(substr_compare("abcde", "abc", 5, 1));
echo '<br><br>';
var_dump(substr_compare("abcde", "abcdef", -10, 10) < 0);
echo '<br><br>';
var_dump(substr_compare("abcde", "abc", 0, 0));
echo "<br><br>Test<br><br><br>";
try {
substr_compare("abcde", "abc", 0, -1);
} catch (\ValueError $e) {
echo $e->getMessage() . "<br>";
}
echo '<br><br>';
var_dump(substr_compare("abcde", "abc", -1, NULL, -5) > 0);
?>