5

私がやりたいことは、中かっこで囲まれたすべてのスペースを見つけて、それらを別の文字に置き換えることです。

何かのようなもの:

{The quick brown} fox jumps {over the lazy} dog

変更するには:

{The*quick*brown} fox jumps {over*the*lazy} dog

すでにネットで調べたのですが、今のところこれだけで、本当に欲しいものに近そうです。

preg_replace('/(?<={)[^}]+(?=})/','*',$string);

上記のコードに関する私の問題は、すべてを置き換えることです。

{*} fox jumps {*} dog

正規表現のチュートリアルを調べて、上記のコードを変更してスペースのみを置き換える方法を見つけましたが、役に立ちませんでした。どんな入力でも大歓迎です。

ありがとう。

4

3 に答える 3

5

すべての中括弧が正しくネストされており、ネストされた中括弧がないと仮定すると、先読みアサーションを使用してこれを行うことができます。

$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
于 2012-10-02T06:57:17.807 に答える
2

文字列操作だけで正規表現を使用したくないというあなたのコメントに反応しています。それは大丈夫ですが、なぜ正規表現を探していると書いたのですか?

正規表現なしのソリューション:

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

?>
于 2012-10-02T07:34:45.233 に答える
1

これはどう:

$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" 
于 2012-10-02T06:57:25.667 に答える