PHP.mk документација

preg_replace_callback

Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.

function.preg-replace-callback.php PHP.net прокси Преводот се освежува
Оригинал на PHP.net
Патека function.preg-replace-callback.php Локална патека за оваа страница.
Извор php.net/manual/en Оригиналниот HTML се реупотребува и локално се стилизира.
Режим Прокси + превод во позадина Кодовите, табелите и белешките остануваат читливи во истиот тек.
preg_replace_callback

Референца за `function.preg-replace-callback.php` со подобрена типографија и навигација.

function.preg-replace-callback.php

preg_replace_callback

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

preg_replace_callbackИзврши пребарување и замена со регуларен израз со помош на повик

= NULL

preg_replace_callback(
         string|array $pattern,
         callable $callback,
         string|array $subject,
         int $limit = -1,
         int &$count = null,
         int $flags = 0
): string|array|null

Поведението на оваа функција е речиси идентично со preg_replace(), освен фактот што наместо replacement параметар, треба да се специфицира callback.

Параметри

pattern

Шемата за пребарување. Може да биде низа или низа со низи.

callback

Повик што ќе биде повикан и ќе му биде предаден список со совпаднати елементи во subject низа. Повикот треба да врати низа за замена. Ова е потпис на повикот:

handler(array $matches): string

Често ќе ви треба callback функција за preg_replace_callback() на едно место. Во овој случај можете да користите анонимна функција за да го декларирате повикот во рамките на повикот до preg_replace_callback(). Правејќи го ова, ги имате сите информации за повикот на едно место и не го затрупувате именскиот простор на функцијата со име на функција за повик што не се користи никаде на друго место.

Пример #1 preg_replace_callback() и анонимна функција

<?php
/* a unix-style command line filter to convert uppercase
* letters at the beginning of paragraphs to lowercase */
$fp = fopen("php://stdin", "r") or die("can't read 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 and PREG_UNMATCHED_AS_NULL знаменца, кои влијаат на форматот на низата за совпаѓања. Погледнете го описот во preg_match() за повеќе детали.

Вратени вредности

preg_replace_callback() враќа низа ако subject параметарот е низа, или стринг инаку. При грешки, вратената вредност е null

Ако се најдат совпаѓања, ќе се врати новиот предмет, инаку subject ќе се врати непроменет.

Errors/Exceptions

Ако дадениот регуларен израз не може да се состави во валиден регуларен израз, еден E_WARNING се емитува.

Дневник на промени

Верзија = NULL
7.4.0 На flags параметар беше додаден.

Примери

Пример #2 preg_replace_callback() example

<?php
// this text was used in 2002
// we want to get this up to date for 2003
$text = "April fools day is 04/01/2002\n";
$text.= "Last christmas was 12/24/2001\n";
// the callback function
function next_year($matches)
{
// as usual: $matches[0] is the complete match
// $matches[1] the match for the first subpattern
// enclosed in '(...)' and so on
return $matches[1].($matches[2]+1);
}
echo
preg_replace_callback(
"|(\d{2}/\d{2}/)(\d{4})|",
"next_year",
$text);

?>

Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред

April fools day is 04/01/2003
Last christmas was 12/24/2002

Пример #3 preg_replace_callback() користење рекурзивна структура за ракување со вграден BB код

<?php
$input
= "plain [indent] deep [indent] deeper [/indent] deep [/indent] plain";

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;
?>

Види Исто така

Белешки од корисници за да означиме кој било валиден PHP израз.

Ричард
пред 13 години
The easiest way to pass more than one parameters to the callback function is with the 'use' keyword. 

[This is better than using global, because it works even when we are already inside a function.]

In this example, the callback function is an anonymous function, which takes one argument, $match, supplied by preg_replace_callback().  The extra 
"use ($ten)" puts the $ten variable into scope for the function.

<?php
$string = "Some numbers: one: 1; two: 2; three: 3 end";
$ten = 10;
$newstring = preg_replace_callback(
    '/(\\d+)/',
    function($match) use ($ten) { return (($match[0] + $ten)); },
    $string
    );
echo $newstring;
#prints "Some numbers: one: 11; two: 12; three: 13 end";
?>
Sjon на hortensius dot net
пред 18 години
preg_replace_callback returns NULL when pcre.backtrack_limit is reached; this sometimes occurs faster then you might expect. No error is raised either; so don't forget to check for NULL yourself
Јури
пред 13 години
If you want to call non-static function inside your class, you can do something like this. 

For PHP 5.2 use second argument like array($this, 'replace'):
<?php
class test_preg_callback{

  private function process($text){
    $reg = "/\{([0-9a-zA-Z\- ]+)\:([0-9a-zA-Z\- ]+):?\}/";
    return preg_replace_callback($reg, array($this, 'replace'), $text);
  }
  
  private function replace($matches){
    if (method_exists($this, $matches[1])){
      return @$this->$matches[1]($matches[2]);     
    }
  }  
}
?>

For PHP 5.3 use second argument like "self::replace":
<?php
class test_preg_callback{

  private function process($text){
    $reg = "/\{([0-9a-zA-Z\- ]+)\:([0-9a-zA-Z\- ]+):?\}/";
    return preg_replace_callback($reg, "self::replace", $text);
  }
  
  private function replace($matches){
    if (method_exists($this, $matches[1])){
      return @$this->$matches[1]($matches[2]);     
    }
  }  
}
?>
carlos dot ballesteros на softonic dot com
пред 16 години
A simple function to replace a list of complete words or terms in a string (for PHP 5.3 or above because of the closure):

<?php
function replace_words($list, $line, $callback) {
    return preg_replace_callback(
        '/(^|[^\\w\\-])(' . implode('|', array_map('preg_quote', $list)) . ')($|[^\\w\\-])/mi',
        function($v) use ($callback) { return $v[1] . $callback($v[2]) . $v[3]; },
        $line
    );
}
?>

Example of usage:
<?php
$list = array('php', 'apache web server');
$str = "php and the apache web server work fine together. php-gtk, for example, won't match. apache web servers shouldn't too.";

echo replace_words($list, $str, function($v) {
    return "<strong>{$v}</strong>";
});
?>
matt на mattsoft точка net
19 години пред
it is much better on preformance and better practice to use the preg_replace_callback function instead of preg_replace with the e modifier.

function a($text){return($text);}

// 2.76 seconds to run 50000 times
preg_replace("/\{(.*?)\}/e","a('\\1','\\2','\\3',\$b)",$a);

// 0.97 seconds to run 50000 times
preg_replace_callback("/\{(.*?)\}/s","a",$a);
Фредов
пред 11 години
<?php
// Nice little function that convert a string to uppercase by keeping the HTMLentities intact.
public static function strtoupper_entities($str) {

    $patternMajEntities = '/(\&([A-Z])(ACUTE|CEDIL|CARON|CIRC|GRAVE|ORN|RING|SLASH|TH|TILDE|UML)\;)+/';
    $str = preg_replace_callback ($patternMajEntities, 
        function ($matches) {
            return "&" . $matches[2] . strtolower($matches[3]) . ";";
        }, strtoupper($str));
    
    return $str;
}
Дрејк
пред 16 години
The good version of the class PhpHex2Str
<?php
class PhpHex2Str
{
    private $strings;

    private static function x_hex2str($hex) {
        $hex = substr($hex[0], 1);
        $str = '';
        for($i=0;$i < strlen($hex);$i+=2) {
            $str.=chr(hexdec(substr($hex,$i,2)));
        }
        return $str;
    }

    public function decode($strings = null) {
        $this->strings = (string) $strings;
        return preg_replace_callback('#\%[a-zA-Z0-9]{2}#', 'PhpHex2Str::x_hex2str', $this->strings);
    }
}

// Exemple
$obj = new PhpHex2Str;

$strings = $obj->decode($strings);
var_dump($strings);
?>
T-Soloveychik на ya dot ru
12 години пред
Text lines numeration:
<?PHP
// Multieline text:
    $Text = "
Some 
Multieline
text
for
numeration";

// For count:
    $GLOBALS["LineNUMBER"] = 1;

// Replace linestart on number:
    PRINT preg_replace_callback("/^/m",function ()
        {
            return $GLOBALS["LineNUMBER"]++."  ";
        },
        $Text);

?>

1
2 Some
3 Multieline
4 text
5 for
6 numeration
development на HashNotAdam dot com
пред 13 години
From PHP 5.3 you can use an anonymous function to pass local variables into the callback.

<?php

public function replace_variables( $subject, $otherVars ) {
    $linkPatterns = array(
        '/(<a .*)href=(")([^"]*)"([^>]*)>/U',
        "/(<a .*)href=(')([^']*)'([^>]*)>/U"
    );

    $callback = function( $matches ) use ( $otherVars ) {
        $this->replace_callback($matches, $otherVars);
    };

    return preg_replace_callback($this->patterns, $callback, $subject);
}

public function replace_callback($matches, $otherVars) {
    return $matches[1] . $otherVars['myVar'];
}
?>
chris на ocproducts dot com
пред 15 години
The pcre.backtrack_limit option (added in PHP 5.2) can trigger a NULL return, with no errors. The default pcre.backtrack_limit value is 100000. If you have a match that exceeds about half this limit it triggers a NULL response.
e.g. My limit was at 100000 but 500500 triggered a NULL response. I'm not running unicode but I *guess* PCRE runs in utf-16.
Евгениј
пред 2 години
Please note! if you have defined namespace,
the usage format must me changed:

echo preg_replace_callback(
            "|(\d{2}/\d{2}/)(\d{4})|",
            __NAMESPACE__ . '\\next_year',
            $text);
steven на nevvix точка com
пред 7 години
<?php
$format = <<<SQL
CREATE DATABASE IF NOT EXISTS :database;
GRANT ALL PRIVILEGES ON :database_name.* TO ':user'@':host';
SET PASSWORD = PASSWORD(':pass');
SQL;
$args = ["database"=>"people", "user"=>"staff", "pass"=>"pass123", "host"=>"localhost"];

preg_replace_callback("/:(\w+)/", function ($matches) use ($args) {
    return @$args[$matches[1]] ?: $matches[0];
}, $format);

/*
Result:

CREATE DATABASE IF NOT EXISTS people;
GRANT ALL PRIVILEGES ON :database_name.* TO 'staff'@'localhost';
SET PASSWORD = PASSWORD('pass123');

The `:database_name` placeholder doesn't exist as a matching key in `$args` so it's returned as is.
This way you know you need to correct the array by adding the "database_name" item.
*/
На оваа страница

Автоматски outline од активната документација.

Насловите ќе се појават тука по вчитување.

Попрегледно читање

Примерите, changelog табелите и user notes се визуелно издвоени за да не се губат во долгата содржина.

Брз совет Користи го outline-от Скокни директно на главните секции од активната страница.
Извор Оригиналниот линк останува достапен Кога ти треба целосен upstream context, отвори го PHP.net во нов tab.