确保子字符串前面有奇数个给定字符

ensure a sub-string is preceded by an odd quantity of a given character

如何确保给定的搜索字符串(即 xxx)前面有 奇数 个给定字符(即 *)?

$string='bla bla xxx bla *xxx bla bla **xxx bla bla ***xxx bla bla ****xxx';
$search='xxx';
$preceding_character='*';

想要$string

$string='bla bla *xxx bla *xxx bla bla ***xxx bla bla ***xxx bla bla *****xxx';

您可以使用 preg_replace_callback() 来完成:http://php.net/manual/en/function.preg-replace-callback.php

<?php

$string='bla bla xxx bla *xxx bla bla **xxx bla bla ***xxx bla bla ****xxx';
$search='xxx';
$char='*';

$string = preg_replace_callback(
    '/(' . preg_quote($char) . '*)(' . $search . ')/', 
    function($matches) {
        global $char;

        //If even number of $char found, add one
        if(strlen($matches[1]) % 2 === 0) {
            return $matches[1] . $char . $matches[2];
        } else {
            return $matches[0];
        }

    }, 
    $string
);

print $string;
?>

此处演示:http://3v4l.org/tZKOF

$string='bla bla xxx bla *xxx bla bla **xxx bla bla ***xxx bla bla ****xxx';
$search='xxx';
$preceding_character='*';

$array_of_strings = explode($search, $string);

foreach ($array_of_strings as $key => $value) { 
    if($value == end($array_of_strings)) break;
    $count_preceding_character = substr_count($value, $preceding_character);
    if($count_preceding_character % 2 == 0) {
         $array_of_strings[$key] = $value.$preceding_character;
    }
}

$final_string = implode($search, $array_of_strings);

echo $final_string;

你也可以这样做

preg_replace("/\s([*]{0}?|((\*\*)+))xxx/", " *xxx", $string);

或使用您的变量

preg_replace("/\s([{$preceding_character}]{0}?|(([{$preceding_character}]{2})+)){$search}/", " {$preceding_character}{$search}", $string);

或更准确地说:

preg_replace("/((^xxx)|(?<=([^*]))xxx|(?<!\*)(\*\*)+xxx)/", "*", $string);