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;
?>