π Best practices Π΄Π»Ρ ΡΠ΅Π³ΡΠ»ΡΡΠΎΠΊ Π² PHP
Π‘ΠΎΠ±ΡΠ°Π» Π·Π΄Π΅ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ best practices, Π»Π°ΠΉΡΡ Π°ΠΊΠΈ ΠΈ ΡΠ°Π·Π½ΡΠ΅ Π·Π°ΠΌΠ΅ΡΠΊΠΈ ΠΏΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Π½Π° PHP.
ΠΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ, Π΅ΡΠ»ΠΈ ΡΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. β
Π Π΅Π³ΡΠ»ΡΡΠΊΠΈ ΡΡΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ. ΠΠΎΡΡΠΎΠΌΡ, ΠΈΠ·Π±Π΅Π³Π°ΠΉ ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π΅ΡΠ»ΠΈ ΡΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ΠΠΈΠΆΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ², ΠΊΠΎΠ³Π΄Π° ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΠ·Π±Π΅Π³Π°ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ:
ΠΠ°Π΄Π°ΡΠ° | Π Π΅ΡΠ΅Π½ΠΈΠ΅ |
---|---|
ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π°Π΄ΡΠ΅ΡΠ° ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΠΎΠΉ ΠΏΠΎΡΡΡ | ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉ filter_var() Ρ FILTER_VALIDATE_EMAIL * |
ΠΡΠΎΠ²Π΅ΡΠΊΠ° IP Π°Π΄ΡΠ΅ΡΠ° | ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉ filter_var() Ρ FILTER_VALIDATE_IP |
ΠΡΠΎΠ²Π΅ΡΠΊΠ° URL | ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉ filter_var() Ρ FILTER_VALIDATE_URL * |
ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π΄Π°ΡΡ | Π‘ΠΌ. ΡΡΡ ΡΠ΅ΠΌΡ Π½Π° Stack Overflow. |
ΠΠ°ΡΡΠΈΠ½Π³ JSON | ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉ json_decode(). |
ΠΠ°ΡΡΠΈΠ½Π³ HTML/XML | ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉ Π³ΠΎΡΠΎΠ²ΡΠΉ ΠΏΠ°ΡΡΠ΅Ρ. Π‘ΠΌ. ΡΠ΅ΠΌΡ Π½Π° Stack Overflow: How do you parse and process HTML/XML in PHP? |
ΠΠ°ΡΡΠΈΠ½Π³ CSV | ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉ str_getcsv() ΠΈΠ»ΠΈ fgetcsv(). |
ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π°Π»ΠΈΡΠΈΡ Π² ΡΡΡΠΎΠΊΠ΅ ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠΈ | ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉ strpos() ΠΈΠ»ΠΈ stripos(). |
ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΡΠΈΡΠ»Π° | ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ. |
* ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π½Π°ΡΠΈΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ Π΄ΠΎΠΌΠ΅Π½Π½ΡΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΈ Π°Π΄ΡΠ΅ΡΠ°ΠΌΠΈ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΠΎΠΉ ΠΏΠΎΡΡΡ
ΠΠ½Π°ΠΉ Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ. π§
ΠΠΎΠΌΠΈΠΌΠΎ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΡ preg_match() ΠΈ preg_replace() Π΅ΡΡΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΎ ΠΊΠΎΡΠΎΡΡΡ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π½Π΅ Π·Π½Π°ΡΡ.
preg_split()
ΠΠ½ΠΎΠ³Π΄Π° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ°Π·Π±ΠΈΡΡ ΡΠ΅ΠΊΡΡ ΠΏΠΎ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ΅Π³ΡΠ»ΡΡΠΊΡ, Π²ΠΌΠ΅ΡΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°:
$input = 'preg__split_for___fun';
if(preg_match_all('/[^_]+/', $input, $m)) {
print_r($m[0]);
} else {
echo 'no match';
}
ΠΠΎΠΏΡΠΎΠ±ΡΠΉ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ°ΠΊ:
$input = 'preg__split_for___fun';
$output = preg_split('/_+/', $input);
print_r($output);
preg_grep()
ΠΡΠ»ΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΌΠ°ΡΡΠΈΠ² ΠΈ ΡΠΎΠΏΠΎΡΡΠ°Π²ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ preg_grep()
.
$input = ['data1', 'data2', 'exclude', 'data3'];
$result = [];
foreach ($input as $v) {
if(preg_match('/data\d+/', $v)) {
$result[] = $v;
}
}
print_r($result); // Array ( [0] => data1 [1] => data2 [2] => data3 )
Π’Π°ΠΊΠΎΠΉ ΠΆΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
$input = ['data1', 'data2', 'exclude', 'data3'];
$result = preg_grep('/data\d+/', $input);
print_r($result); // Array ( [0] => data1 [1] => data2 [3] => data3 )
ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΡΡΠ΅ΡΡΡ, ΡΡΠΎ preg_grep()
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΌΠ°ΡΡΠΈΠ² ΠΏΡΠΎΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΠΎ ΠΊΠ»ΡΡΠ°ΠΌ ΠΈΠ· Π²Ρ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π°.
preg_filter()
Π‘ΠΎΠ³Π»Π°ΡΠ½ΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ:
preg_filter() is identical to preg_replace() except it only returns the (possibly transformed) subjects where there was a match.
ΠΠΎ ΡΡΡΠΈ, ΡΡΠΎ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΈ preg_grep()
, Π½ΠΎ Ρ ΠΎΠΏΡΠΈΠ΅ΠΉ replace.
preg_replace_callback()
Π€ΡΠ½ΠΊΡΠΈΡ Π·Π°ΠΌΠ΅Π½Ρ Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ»Π»-Π±Π΅ΠΊ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π²ΡΠ±ΡΠ°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ»ΠΎΠ² ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ ΠΈΡ Π² Π²Π΅ΡΡ Π½ΠΈΠΉ ΡΠ΅Π³ΠΈΡΡΡ:
$input = 'words are important';
$output = preg_replace_callback('/\w+/', function($m) {
return strtoupper($m[0]);
}, $input);
echo $output;
preg_quote()
Π€ΡΠ½ΠΊΡΠΈΡ ΡΠΊΡΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π² ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡΡ . ΠΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΡΡΡΡ Π² ΡΠ»ΡΡΠ°Π΅ Π΅ΡΠ»ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ Π²Π²ΠΎΠ΄ Π² ΡΠ΅Π³ΡΠ»ΡΡΠΊΡ:
$user_input = isset($_GET['input']) ? (string) $_GET['input'] : '';
$haystack = 'List: pid1000, pid2000, pid3000...';
$regex = '/' . preg_quote($user_input, '/') . '\d+/';
if(preg_match_all($regex, $haystack, $m)) {
print_r($m[0]);
} else {
echo 'no match';
}
preg_last_error()
ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΡΡΡΡ Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ, ΠΎΠ½Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ PCRE Regex. Π€ΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ΄Π° ΠΎΡΠΈΠ±ΠΊΠΈ Π² ΡΠ΅ΠΊΡΡ:
function preg_errtxt($errcode)
{
static $errtext;
if (!isset($errtxt))
{
$errtext = array();
$constants = get_defined_constants(true);
foreach ($constants['pcre'] as $c => $n) if (preg_match('/_ERROR$/', $c)) $errtext[$n] = $c;
}
return array_key_exists($errcode, $errtext)? $errtext[$errcode] : NULL;
}
Π Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ.
ΠΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ Β«eΒ»
e
- ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ evil eval. ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΅Π³ΠΎ Ρ preg_replace()
ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΡ ΠΏΠΎ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎΠΌΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡ Π΅Π³ΠΎ ΠΊΠ°ΠΊ PHP-ΠΊΠΎΠ΄.
$input = 'up this case!';
$output = preg_replace('/\w+/e', 'strtoupper($0)', $input);
echo $output; // UP THIS CASE!
ΠΠΎ, ΡΡΠΎ ΡΠΆΠ΅ ΠΈΡΡΠΎΡΠΈΡ ΠΈ Ρ /e
ΡΡ ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ ΡΡΠΎΠ»ΠΊΠ½Π΅ΡΡΡΡ, ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ Π±ΡΠ΄Π΅ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π΄ΡΠ΅Π²Π½ΠΈΠΌ Π»Π΅Π³Π°ΡΠΈ ΠΊΠΎΠ΄ΠΎΠΌ! ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° Π±ΡΠ»ΠΎ ΠΎΡΠΌΠ΅ΡΠ΅Π½ΠΎ ΠΊΠ°ΠΊ deprecated Π½Π°ΡΠΈΠ½Π°Ρ Ρ PHP 5.5, Π° Π² PHP 7 Π΅Π³ΠΎ ΡΠ΄Π°Π»ΠΈΠ»ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ.
ΠΠΌΠ΅ΡΡΠΎ /e
ΡΡΠΎΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ preg_replace_callback()
, ΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ Ρ ΠΏΠΈΡΠ°Π» ΡΠ°Π½Π΅Π΅:
$input = 'up this case!';
$output = preg_replace_callback('/\w+/', function($m) {
return strtoupper($m[1]);
}, $input);
echo $output; // UP THIS CASE!
ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ. π
ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ - ΠΎΡΠ΅Π½Ρ Ρ ΠΎΡΠΎΡΠ°Ρ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°. Π’Π°ΠΊ ΠΆΠ΅, Π½Π΅ ΡΡΠΎΠΈΡ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΏΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ.
eXtended mode
ΠΡΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π² Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° x
:
// Regex for password validation
$regex = '/
^ # start-of-string
(?=.*[0-9]) # a digit must occur at least once
(?=.*[a-z]) # a lower case letter must occur at least once
(?=.*[A-Z]) # an upper case letter must occur at least once
(?=.*[@#$%^&+=]) # a special character must occur at least once
(?=\S+$) # no whitespace allowed in the entire string
.{8,} # anything, at least eight places though
$ # end-of-string
/x';
ΠΡΠ΅ ΡΡΠΎ ΠΈΠ΄Π΅Ρ ΠΏΠΎΡΠ»Π΅ ΡΠΈΠΌΠ²ΠΎΠ»Π° Ρ Π΅ΡΡΠ΅Π³Π° ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΡΡΡ, ΡΠ°ΠΊ ΠΆΠ΅ ΠΈΠ³Π½ΠΎΡΠΈΡΡΡΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»Ρ ΠΏΡΠΎΠ±Π΅Π»Ρ. ΠΠ·-Π·Π° ΡΡΠΎΠ³ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½ΡΠΉ ΠΊΠ°ΠΌΠ΅Π½Ρ: ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠΎΠ±Π΅Π»Ρ ΠΈΠ³Π½ΠΎΡΠΈΡΡΡΡΡΡ, ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ, Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ ΡΠΌΠ°ΡΡΠΈΡΡ ΠΏΡΠΎΠ±Π΅Π»? ΠΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ²:
- ΠΠΊΡΠ°Π½ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠ±Π΅Π»
$regex = '/\ +/x';
- ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ
$regex = '/\s+/x
ΠΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ².
Π Π΅Π³ΡΠ»ΡΡΠ½ΡΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² PHP ΠΈΠΌΠ΅ΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ². Π Π½Π΅ΠΌ Π΅ΡΡΡ Π΄Π°ΠΆΠ΅ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ, ΠΊΠΎΡΠΎΡΡΡ Π½Π΅Ρ Π² PCRE. ΠΠΎΡΡΠΎΠΌΡ, Π½Π°ΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΡΡΡ Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅ΠΉ.
ΠΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ Β«iΒ»
ΠΡΠ»ΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ ΡΡΠΎΡ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ, ΡΠΎ ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ ΡΠ°Π±Π»ΠΎΠ½ Π½Π΅ΡΡΠ²ΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΠΊ ΡΠ΅Π³ΠΈΡΡΡΡ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ ΡΠ΅Π³ΡΠ»ΡΡΠΊΠ° Π²ΠΈΠ΄Π° /[a-zA-Z0-9]+/
, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΏΡΠΎΡΡΠΈΡΡ Π΅Π΅ Π΄ΠΎ /[a-z0-9]+/i
. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ Π½Π΅ Π·Π°Ρ
ΠΎΡΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ, ΡΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ΅Π³ΡΠ»ΡΡΠΊΡ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΎΠΉ.
ΠΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ Β«sΒ»
Π’Π°ΠΊ ΠΆΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΊΠ°ΠΊ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ/ΡΠ΅ΠΆΠΈΠΌ DOTALL. ΠΡΠ»ΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ ΡΡΠΎΡ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ, ΡΠΎ Π²ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ ΡΠΎΡΠΊΠΈ .
Π±ΡΠ΄ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΠ‘ΠΠΠ£, Π²ΠΊΠ»ΡΡΠ°Ρ ΡΠΈΠΌΠ²ΠΎΠ»Ρ Π½ΠΎΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ /a.*b/
Π±ΡΠ΄Π΅Ρ ΠΌΠ°ΡΡΠΈΡΡ:
a test b
ΠΠΎ, Π½Π΅ ΡΠΌΠ°ΡΡΠΈΡ
a test
test b
ΠΠ΄Π½Π°ΠΊΠΎ, /a.*b/s
ΡΠΌΠ°ΡΡΠΈΡ ΠΎΠ±Π° Π²Π°ΡΠΈΠ°Π½ΡΠ°.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΡΠΎΡΠΊΠ° Π² ΠΊΠ»Π°ΡΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² [.]
ΡΠ΅ΡΡΠ΅Ρ ΡΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ½Π° Π±ΡΠ΄Π΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠΎΠ²Π°ΡΡ Π±ΡΠΊΠ²Π°Π»ΡΠ½ΠΎ ΡΠΎΡΠΊΠ΅.
ΠΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ Β«mΒ»
Π’Π°ΠΊ ΠΆΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΊΠ°ΠΊ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ/ΡΠ΅ΠΆΠΈΠΌ MULTILINE. Π¦ΠΈΡΠ°ΡΠ° ΠΈΠ· Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ:
By default, PCRE treats the subject string as consisting of a single “line” of characters (even if it actually contains several newlines). The “start of line” metacharacter ^ matches only at the start of the string, while the “end of line” metacharacter $ matches only at the end of the string, or before a terminating newline (unless D modifier is set). This is the same as Perl. When this modifier is set, the “start of line” and “end of line” constructs match immediately following or immediately before any newline in the subject string, respectively, as well as at the very start and end. This is equivalent to Perl’s /m modifier. If there are no \n characters in a subject string, or no occurrences of ^ or $ in a pattern, setting this modifier has no effect.
Π§ΡΠΎ ΡΡΠΎ Π·Π½Π°ΡΠΈΡ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅? ΠΠΎΠΏΡΡΡΠΈΠΌ ΠΌΡ Ρ
ΠΎΡΠΈΠΌ Π½Π°ΠΉΡΠΈ ΠΎΠ΄Π½Ρ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΈΡΡ [0-9]+
Π² Π½Π°ΡΠ°Π»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ. Π Π΅Π³ΡΠ»ΡΡΠΊΠ° Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ /^[0-9]+/m
. ΠΠ΅Π· ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° /m
ΡΠ΅Π³ΡΠ»ΡΡΠΊΠ° Π±ΡΠ΄Π΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΈΡΡΠ°ΠΌ Π² ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅.
123 # Matched by /^[0-9]+/ and /^[0-9]+/m
1234 # Matched by /^[0-9]+/m
12345 # Matched by /^[0-9]+/m
ΠΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ Β«uΒ»
ΠΡΠ»ΠΈ ΡΡΠΎΡ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½, ΡΠΎ Π²Ρ ΠΎΠ΄Π½Π°Ρ ΡΡΡΠΎΠΊΠ° ΠΈ regex ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΊ UTF-8. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ ΡΠΎ ΡΡΡΠΎΠΊΠ°ΠΌΠΈ UTF-8 Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΊΠ»ΡΡΠΈΡΡ ΡΡΠΎΡ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ.
ΠΡΠΎΡ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΡΠΎΠΈΡ Π²ΠΊΠ»ΡΡΠΈΡΡ, Π΅ΡΠ»ΠΈ Π²Ρ Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½Ρ ΡΡΠΎ Π±ΡΠ΄Π΅ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ASCII (ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎΠ±Π°ΠΉΡΠΎΠ²ΡΠΌΠΈ Π½Π°Π±ΠΎΡΠ°ΠΌΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²). ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΊΠ»Π°ΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ \w
, \d
, \s
, \b
, … ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠΌΠΈ Ρ Unicode, ΠΊΠΎΠ³Π΄Π° ΡΡΠΎΡ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½.
ΠΡΠ±ΠΎΡ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π»Ρ.
ΠΠ±ΡΡΠ½ΠΎ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π»Ρ Π² ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ» ΡΠ»Π΅ΡΠ° (ΠΊΠΎΡΠΎΠΉ ΡΠ΅ΡΡΡ) /
. ΠΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π»ΠΈ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π΅ΡΠ»ΠΈ Π² Π²Π°ΡΠ΅ΠΌ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π΅ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΡΠ»Π΅ΡΠ°.
// Backslash
$regex = '/^\/user\/(\d+)\/?/i';
// Clean
$regex = '~^/user/(\d+)/?~i';
ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π»ΡΠΌΠΈ ΡΠ²Π»ΡΡΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»Ρ #
,!
,%
,_
,;
. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΠΌΠ΅Π½ΡΡΠ΅ΠΉ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡΡ Π±ΡΠ΄Π΅Ρ ΡΠ°ΡΡΠΎ Π²ΡΡΡΠ΅ΡΠ°ΡΡΡΡ Π² Π²Π°ΡΠ΅ΠΌ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ #
ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ x
Π΄Π»Ρ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π² ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° Ρ Π²Π°Ρ ΠΏΡΠΎΡΡΠΎ Π΅ΡΡΡ ΡΠ΅Π³ΡΠ»ΡΡΠΊΠ° Ρ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΡΠΈΡ
ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ².
ΠΠ΄Π½ΠΈΠΌ ΠΈΠ· Π½Π΅ ΠΎΡΠ΅Π½Ρ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ
, Π½ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ
ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π°ΡΡΠΈΠΌΠ΅ΡΡΠΈΡΠ½ΠΎΠΉ ΠΏΠ°ΡΡ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π»Π΅ΠΉ, ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ ()
:
$regex = '(^/user/(\d+)/?)i';
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΠΊΠΎΠ±ΠΊΠΈ Π²Π½ΡΡΡΠΈ ΡΠ΅Π³ΡΠ»ΡΡΠΊΠΈ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠΊΡΠ°Π½ΠΈΡΠΎΠ²Π°ΡΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΏΠ΅ΡΠ²ΡΠ΅ ΡΠΊΠΎΠ±ΠΊΠΈ ΠΊΠ°ΠΊ Β«Π³ΡΡΠΏΠΏΡ 0Β», Π° Π²ΡΠΎΡΡΠ΅ (Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠ΅ ΡΠΊΠΎΠ±ΠΊΠΈ) ΠΊΠ°ΠΊ Β«Π³ΡΡΠΏΠΏΡ 1Β».
ΠΠ½Π°ΠΉ ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠΊΡΠ°Π½ΠΈΡΠΎΠ²Π°ΡΡ.
ΠΠ½ΠΎΠ³Π΄Π°, Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ Π½Π΅ ΡΡΠ΅Π±ΡΡΡ ΡΠΊΡΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅. Π ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΊΡΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠ»ΡΠ½ΠΎ Π·Π°ΠΏΡΡΡΠ²Π°Π΅Ρ ΠΈ Π·Π°ΡΡΡΠ΄Π½ΡΠ΅Ρ ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎΠ³ΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ.
// ΠΠ΅ΠΏΠΎΠ½ΡΡΠ½ΠΎ
$regex = '~\>\>user\d+\,\ \"\d+\-\d+\"~';
// ΠΠΎΠ½ΡΡΠ½ΠΎ
$regex = '~>>user\d+, "\d+-\d+"~';
Π§ΡΠΎ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠΊΡΠ°Π½ΠΈΡΠΎΠ²Π°ΡΡ?
- Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ»Ρ
<>@!#~=_,'"
, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π»Ρ./<>@!#~=_,'"/
ΡΠΌΠ°ΡΡΠΈΡ<>@!#~=_,'"
.
- ΠΡΠΎΠ±Π΅Π»Ρ, Π΅ΡΠ»ΠΈ ΡΡ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ
x
. - ΠΠ΅ΡΠΈΡΡ Π²Π½Π΅ Π³ΡΡΠΏΠΏΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ².
/-+/
ΡΠΌΠ°ΡΡΠΈΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅ΡΠΈΡΠΎΠ².
- ΠΠ΅ΡΠΈΡΡ Π²Π½ΡΡΡΠΈ Π³ΡΡΠΏΠΏΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π² Π½Π°ΡΠ°Π»Π΅ ΠΈ Π² ΠΊΠΎΠ½ΡΠ΅.
/[a-z-]+/
Π±ΡΠ΄Π΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ Π±ΡΠΊΠ² ΠΎΡa
Π΄ΠΎz
, Π²ΠΊΠ»ΡΡΠ°Ρ Π΄Π΅ΡΠΈΡ. ΠΡΠΈΠΌΠ΅Ρ:abcde-fgh
./[-a-z]+/
ΡΠΎΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΡΡΠΎ ΠΈ Π²ΡΡΠ΅.