Как сопоставить и заменить в полный рот с PHP? - PullRequest
1 голос
/ 08 октября 2009

Примерно так, но я не хочу делать это 2 раза:

preg_match_all($pattern,$string,$matches);
$string = preg_replace($pattern,'',$string);

Ответы [ 5 ]

1 голос
/ 08 октября 2009

OK

, поэтому вы хотите захватить совпадения и заменить их одним вызовом функции. Я предполагаю, что вы не хотите обрабатывать дорогостоящее регулярное выражение дважды, иначе я не вижу веской причины хотеть сделать ваш код менее читабельным.

Во всяком случае,

Вы можете попробовать использовать preg_replace_callback(). Что-то вроде:

class MatchReplace {

    var $matches;
    var $pattern;
    var $replacement;
    var $string;
    var $matchCount;

    function __construct($pattern, $replacement) {
        $this->replacement = $replacement;
        $this->pattern = $pattern;
    }

    function matchAndReplace($string) {
        $this->string = $string;

        var_dump($string);
        var_dump($this->pattern);

        return preg_replace_callback($this->pattern, 
                array($this, '_worker'), $string, -1, $this->matchCount);
    }


    function _worker($matches) {
        echo "Matches:\n";
        var_dump($matches);
    }
}

Пример выполнения:

<code>echo "<pre>\n";
$m = new MatchReplace('|(abc)|', '');
echo "\nResult: \n".$m->matchAndReplace('XXXabcYYY');

echo "\n
";

Выход:

string(9) "XXXabcYYY"
string(7) "|(abc)|"
Matches:
array(2) {
  [0]=>
  string(3) "abc"
  [1]=>
  string(3) "abc"
}

Result: 
XXXYYY
0 голосов
/ 08 октября 2009
preg_match_all($pattern1,$string,$matches);
$result = preg_grep($pattern2, $matches);
0 голосов
/ 08 октября 2009

Судя по всему, вы делаете две совершенно разные вещи.

preg_match_all($pattern,$string,$matches); // return all the matches
$string = preg_replace($pattern,'',$string); // replace all the matches in the string

То есть вы на самом деле ничего не делаете дважды. Если вы не используете $ match где-то еще ниже, первая строка не имеет значения, если вы все равно собираетесь делать предслововые слова preg_replace.

0 голосов
/ 08 октября 2009

Если вам не нужны необычные правила замены (например, регулярные выражения), вы всегда должны использовать функцию str_replace () вместо ereg_replace () или preg_replace ().

http://uk.php.net/str_replace

Это будет делать все вхождения и только 1 команда.

0 голосов
/ 08 октября 2009

ты имеешь в виду что-то подобное?

$string = preg_replace(preg_match_all($pattern,$string,$matches),'',$string);

Обновление:

Я так и думал, что вы хотите что-то подобное ... но теперь вы можете видеть, что это невозможно без усложнения вещей (как ответ @gnud). Так что ответ Нет, вы не можете сделать это в одну строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...