确保子字符串前面有奇数个给定字符
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;
?>
$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);
如何确保给定的搜索字符串(即 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;
?>
$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);