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

Php 确保子字符串前面有给定字符的奇数,php,regex,substring,Php,Regex,Substring,如何确保给定的搜索字符串(即xxx)前面有给定字符(即*)的奇数数量 所需的$string $string='bla bla *xxx bla *xxx bla bla ***xxx bla bla ***xxx bla bla *****xxx'; 您可以使用preg_replace_callback()执行此操作: 此处演示:您可以使用preg\u replace\u callback()执行此操作: 此处演示:您也可以这样做 preg_replace("/\s([*]{0}?|(

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

所需的
$string

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

您可以使用preg_replace_callback()执行此操作:



此处演示:

您可以使用preg\u replace\u callback()执行此操作:



此处演示:

您也可以这样做

preg_replace("/\s([*]{0}?|((\*\*)+))xxx/", " *$1xxx", $string);
或者用你的变量

preg_replace("/\s([{$preceding_character}]{0}?|(([{$preceding_character}]{2})+)){$search}/", " {$preceding_character}$1{$search}", $string);
或者更准确地说:

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

preg\u replace(“/(^xxx)|)(?您也可以这样做

preg_replace("/\s([*]{0}?|((\*\*)+))xxx/", " *$1xxx", $string);
或者用你的变量

preg_replace("/\s([{$preceding_character}]{0}?|(([{$preceding_character}]{2})+)){$search}/", " {$preceding_character}$1{$search}", $string);
或者更准确地说:

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


preg\u replace(“/(^xxx)|(?你试过什么吗?@caCtus没什么好的。我知道一点正则表达式,可以用string\u replace,但不知道如何处理
odd
部分。你试过什么吗?@caCtus没什么好的。我知道一点正则表达式,可以用string\u replace,但不知道如何处理
odd
部分。我也做了同样的。但有些晚了:)我认为正则表达式必须从
(^ |\s+)开始
否则第1个单词将不匹配。并添加了
\b
谢谢打字头。比我希望的要复杂一点,但我想它应该是这样的。我可以问一下为什么
$char
需要是全局的吗?如果不是,它将在回调函数中不可用。@splash58我认为第一个单词是匹配的,但我不在乎关于单词边界的测试。可能应该添加
\b
,以确保只替换“**xxx”,而不是“**xxxxxxx”。我也这样做。但有些晚了:)我认为正则表达式必须从
(^ |\s+)开始
否则第1个单词将不匹配。并添加了
\b
谢谢打字头。比我希望的要复杂一点,但我想它应该是这样的。我可以问一下为什么
$char
需要是全局的吗?如果不是,它将在回调函数中不可用。@splash58我认为第一个单词是匹配的,但我不在乎关于使用单词边界进行测试。可能应该添加
\b
,以确保只替换“**xxx”,而不是“**xxxxxxxx”。@user1032531它会在字符串中查找带有xxx的偶数
*
,然后在匹配的字符串中添加*使其变为奇数谢谢。需要仔细考虑,但它看起来很完美。还有,
(\*\*)+)
([*]{2})+)
相同?啊,我看到了陷阱。如果用空格进行匹配,则不会匹配
$
。@user1032531您能分享您试图匹配的内容吗,string和regexplore请注意,没有用空格进行匹配的偶数
*
是如何不被修改的。@user1032531它会在字符串中查找带有xxx的偶数
*
然后,d将*附加到匹配的字符串中,使其变为奇怪谢谢。需要仔细考虑,但它看起来很完美。另外,is
(\*\*)+)
([*]{2})+)
相同?啊,我看到了陷阱。如果由空格进行,则不会匹配
$
。@user1032531您可以共享您尝试匹配的内容、字符串和regexplore请注意,没有由空格进行的偶数
*
是如何不被修改的。