Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 替换大括号内封闭的所有空间_Php_Regex_Preg Replace_Preg Match - Fatal编程技术网

Php 替换大括号内封闭的所有空间

Php 替换大括号内封闭的所有空间,php,regex,preg-replace,preg-match,Php,Regex,Preg Replace,Preg Match,我要做的是找到所有用大括号括起来的空格,然后用另一个字符替换它们 比如: {The quick brown} fox jumps {over the lazy} dog 改为: {The*quick*brown} fox jumps {over*the*lazy} dog 我已经在网上搜索过了,但到目前为止,我只找到了这个,而且它似乎非常接近我真正想要的 preg_replace('/(?<={)[^}]+(?=})/','*',$string); 我查阅了regexp教程,想知道如

我要做的是找到所有用大括号括起来的空格,然后用另一个字符替换它们

比如:

{The quick brown} fox jumps {over the lazy} dog
改为:

{The*quick*brown} fox jumps {over*the*lazy} dog
我已经在网上搜索过了,但到目前为止,我只找到了这个,而且它似乎非常接近我真正想要的

preg_replace('/(?<={)[^}]+(?=})/','*',$string);
我查阅了regexp教程,想知道如何修改上面的代码,只替换空格,但没有用。如有任何意见,我们将不胜感激


谢谢。

假设所有大括号都已正确嵌套,并且没有嵌套大括号,则可以使用前瞻性断言执行此操作:

$result = preg_replace('/ (?=[^{}]*\})/', '*', $subject);
仅当下一个大括号是右大括号时,此选项才匹配并替换空格:

(?=     # Assert that the following regex can be matched here:
 [^{}]* #  - Any number of characters except braces
 \}     #  - A closing brace
)       # End of lookahead
这个怎么样:

$a = '{The quick brown} fox jumps {over the lazy} dog';
$b = preg_replace_callback('/\{[^}]+\}/sim', function($m) {
    return str_replace(' ', '*', $m[0]);
}, $a);
var_dump($b); // output: string(47) "{The*quick*brown} fox jumps {over*the*lazy} dog" 

我是回应你的评论,你不想使用正则表达式,只是字符串操作。那没关系,但是为什么你要写你正在寻找一个正则表达式呢

不带正则表达式的解决方案:

<?php

$str = "{The quick brown} fox jumps {over the lazy} dog";

for($i = 0, $b = false, $len = strlen($str); $i < $len; $i++)
{ 
    switch($str[$i])
    {
        case '{': $b = true; continue;
        case '}': $b = false; continue;
        default:
        if($b && $str[$i] == ' ')
            $str[$i] = '*';
    }
}

print $str;

?>


只需在空格之间分解字符串,然后将生成的数组与空格之间的“*”组合在一起。对不起,我太累了,无法写一个例子。谢谢。这项工作做得很出色。但是,我正在尝试使用php字符串函数(strpos、substr等)的解决方案。你仍然建议使用正则表达式吗?我读过关于正则表达式很慢之类的东西。@Bibokid:你可以分析一下Zaffy和我的解决方案,然后发现-正则表达式不一定很慢(但它们通常构造得很慢,这使得它们很慢,因为当有聪明的解决方案可用时,它们必须强制执行一个解决方案)。在许多情况下,正则表达式库都经过了高度优化,可以比您自己使用字符串函数构建的任何解决方案都快得多。只是当我在stackoverflow中等待响应时,我尝试了一个非正则表达式的解决方案。谢谢你,我也会试试。谢谢。我也会尝试一下,并与其他解决方案进行比较。
<?php

$str = "{The quick brown} fox jumps {over the lazy} dog";

for($i = 0, $b = false, $len = strlen($str); $i < $len; $i++)
{ 
    switch($str[$i])
    {
        case '{': $b = true; continue;
        case '}': $b = false; continue;
        default:
        if($b && $str[$i] == ' ')
            $str[$i] = '*';
    }
}

print $str;

?>