preg_replace_callback
(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)
preg_replace_callback β ΠΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΏΠΎΠΈΡΠΊ ΠΏΠΎ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎΠΌΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΌΠ΅Π½ΡΠ΅Ρ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΡ callback-ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ
Π‘ΠΏΠΈΡΠΎΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²
pattern
-
ΠΡΠΊΠΎΠΌΡΠΉ ΡΠ°Π±Π»ΠΎΠ½: ΡΡΡΠΎΠΊΠ° ΠΈΠ»ΠΈ ΠΌΠ°ΡΡΠΈΠ² ΡΡΡΠΎΠΊ.
callback
-
Callback-ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ Π²ΡΠ·ΠΎΠ²Π° ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ
ΠΌΠ°ΡΡΠΈΠ²Π° ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ Π½Π°ΡΠ»Π° Π² ΡΡΡΠΎΠΊΠ΅ subject.
Π‘ΠΈΠ³Π½Π°ΡΡΡΠ° callback-ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠ΅Π΄ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ Π²ΠΎΠ·Π²ΡΠ°Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΠ½Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ:
ΠΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ preg_replace_callback()
callback-ΡΡΠ½ΠΊΡΠΈΡ ΡΠ°ΡΡΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΎΠ΄Π½ΠΎΠΊΡΠ°ΡΠ½ΠΎ,
ΠΏΠΎΡΡΠΎΠΌΡ Π΄Π»Ρ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° Π²Π½ΡΡΡΠΈ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ preg_replace_callback()
ΠΎΠ±ΡΡΠ²Π»ΡΡΡ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ.
ΠΡΠΈ ΡΠ°ΠΊΠΎΠΌ ΡΠΏΠΎΡΠΎΠ±Π΅ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π²ΡΠ·ΠΎΠ²Π΅ ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅
ΠΈ Π½Π΅ Π·Π°Π³ΡΠΎΠΌΠΎΠΆΠ΄Π°Π΅Ρ ΡΠ΅ΠΊΡΡΠ΅Π΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΈΠΌΡΠ½
Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ callback-ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π² Π΄ΡΡΠ³ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅.
ΠΡΠΈΠΌΠ΅Ρ #1 ΠΡΠΈΠΌΠ΅Ρ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ preg_replace_callback() Ρ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ callback-ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ
<?php
/* Π€ΠΈΠ»ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π² ΡΡΠΈΠ»Π΅ Unix-ΡΠΈΡΡΠ΅ΠΌ
* Π΄Π»Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ Π·Π°Π³Π»Π°Π²Π½ΡΡ
Π±ΡΠΊΠ² Π² Π½Π°ΡΠ°Π»Π΅ ΠΏΠ°ΡΠ°Π³ΡΠ°ΡΠ° Π² ΡΡΡΠΎΡΠ½ΡΠ΅ */
$fp = fopen("php://stdin", "r") or die("Π½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ ΠΏΡΠΎΡΠ΅ΡΡΡ stdin");
while (!feof($fp)) {
$line = fgets($fp);
$line = preg_replace_callback(
'|<p>\s*\w|',
function ($matches) {
return strtolower($matches[0]);
},
$line
);
echo $line;
}
fclose($fp);
?>
subject
-
Π‘ΡΡΠΎΠΊΠ° ΠΈΠ»ΠΈ ΠΌΠ°ΡΡΠΈΠ² ΡΡΡΠΎΠΊ Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΠΈ Π·Π°ΠΌΠ΅Π½Ρ.
limit
-
ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΌΠ΅Π½ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ°Π±Π»ΠΎΠ½Π°
Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ subject. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
ΡΠ°Π²Π½ΠΎ -1 (Π±Π΅Π· ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ).
count
-
ΠΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ Ρ ΡΡΠΈΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ
Π·Π°ΠΌΠ΅Π½, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΠ»Π° ΡΡΠ½ΠΊΡΠΈΡ.
flags
-
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ flags ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΡΠ»Π°Π³ΠΎΠ²
PREG_OFFSET_CAPTURE
ΠΈ PREG_UNMATCHED_AS_NULL, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Π»ΠΈΡΡΡ
Π½Π° ΡΠΎΡΠΌΠ°Ρ ΠΌΠ°ΡΡΠΈΠ²Π° ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠΉ.
ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π΄Π°ΡΡ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ preg_match().
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
Π€ΡΠ½ΠΊΡΠΈΡ preg_replace_callback() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΌΠ°ΡΡΠΈΠ²,
Π΅ΡΠ»ΠΈ Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ subject ΠΏΠ΅ΡΠ΅Π΄Π°Π»ΠΈ ΠΌΠ°ΡΡΠΈΠ²,
ΠΈΠ½Π°ΡΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΡΠΎΠΊΡ. Π€ΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ null, Π΅ΡΠ»ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ°.
Π€ΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΠΎΠ²ΡΡ ΡΡΡΠΎΠΊΡ, Π΅ΡΠ»ΠΈ Π½Π°ΡΠ»Π° ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΡ,
ΠΈΠ½Π°ΡΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΡΠΎΠΊΡ subject Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.
ΠΡΠΈΠ±ΠΊΠΈ
ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π»ΠΈ ΡΠ°Π±Π»ΠΎΠ½ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎΠ³ΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ Π² Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎΠ΅ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅,
Π²ΡΠ΄Π°ΡΡΡΡ ΠΎΡΠΈΠ±ΠΊΠ° ΡΡΠΎΠ²Π½Ρ E_WARNING.
Π‘ΠΏΠΈΡΠΎΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
ΠΡΠΈΠΌΠ΅ΡΡ
ΠΡΠΈΠΌΠ΅Ρ #2 ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ preg_replace_callback()
<?php
// Π’Π΅ΠΊΡΡ Π½Π°ΠΏΠΈΡΠ°Π»ΠΈ Π² 2002 Π³ΠΎΠ΄Ρ
// ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ Π΄Π°ΡΡ Π½Π° 2003 Π³ΠΎΠ΄
$text = "ΠΠ΅Π½Ρ ΡΠΌΠ΅Ρ
Π° ΠΎΡΠΌΠ΅ΡΠ°Π»ΠΈ 01/04/2002\n";
$text.= "ΠΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ Π ΠΎΠΆΠ΄Π΅ΡΡΠ²ΠΎ ΠΎΡΠΌΠ΅ΡΠ°Π»ΠΈ 24/12/2001\n";
// Callback-ΡΡΠ½ΠΊΡΠΈΡ
function next_year($matches)
{
// Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎ: $matches[0] β ΠΏΠΎΠ»Π½ΠΎΠ΅ Π²Ρ
ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΎΠ½Π°,
// $matches[1] β Π²Ρ
ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΏΠΎΠ΄ΠΌΠ°ΡΠΊΠΈ
// Π² ΠΊΡΡΠ³Π»ΡΡ
ΡΠΊΠΎΠ±ΠΊΠ°Ρ
'(...)' ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅...
return $matches[1].($matches[2]+1);
}
echo preg_replace_callback(
"|(\d{2}/\d{2}/)(\d{4})|",
"next_year",
$text,
);
?>
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
ΠΠ΅Π½Ρ ΡΠΌΠ΅Ρ
Π° ΠΎΡΠΌΠ΅ΡΠ°Π»ΠΈ 01/04/2003
ΠΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ Π ΠΎΠΆΠ΄Π΅ΡΡΠ²ΠΎ ΠΎΡΠΌΠ΅ΡΠ°Π»ΠΈ 24/12/2002
ΠΡΠΈΠΌΠ΅Ρ #3 ΠΡΠΈΠΌΠ΅Ρ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ BB-ΠΊΠΎΠ΄Π° ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ preg_replace_callback()
<?php
$input = "Π²Π΅ΡΡ
[indent] Π³Π»ΡΠ±ΠΆΠ΅ [indent] Π΅ΡΡ Π³Π»ΡΠ±ΠΆΠ΅ [/indent] Π³Π»ΡΠ±ΠΆΠ΅ [/indent] Π²Π΅ΡΡ
";
function parseTagsRecursive($input)
{
$regex = '#\[indent]((?:[^[]|\[(?!/?indent])|(?R))+)\[/indent]#';
if (is_array($input)) {
$input = '<div style="margin-left: 10px">'.$input[1].'</div>';
}
return preg_replace_callback($regex, 'parseTagsRecursive', $input);
}
$output = parseTagsRecursive($input);
echo $output;
?>
Π‘ΠΌΠΎΡΡΠΈΡΠ΅ ΡΠ°ΠΊΠΆΠ΅