2017-11-08 13 views
0

斜体の括弧内に書かれたテキストを除いて、テキスト文字列全体を大文字に変換したい。preg_replace_callbackとの一致を取得

また、大括弧を削除する必要があります。

私は、次のコードを作ってきたが、それは逆のことを行います

$text='this PART should be CONVERTED to uppercase [This PART should not BE changed] this part should also be CONVERTED to uppercase [THIS part should also not be CHANGED] etc..';  

    $text = preg_replace_callback(
     "(\[(.*?)\])is", 
     function($m) { 

      return strtoupper($m[1]); 
     }, 
     $text); 
    echo $text; 
+0

チェック; '、あなたは' $を取りますm [1] ' - >最初のサブパターンの一致。 –

答えて

2

あなたはそれらのマッチをスキップするPCRE動詞SKIPFAILを使用することができます。これらの詳細については、http://www.rexegg.com/regex-best-trick.htmlをご覧ください。

$text='this PART should be CONVERTED to uppercase [This PART should not BE changed] this part should also be CONVERTED to uppercase [THIS part should also not be CHANGED] etc..';  
$text = preg_replace_callback(
     "/\[(.*?)\](*SKIP)(*FAIL)|\w+/is", 
     function($m) { 
      return strtoupper($m[0]); 
     }, 
     $text); 
echo $text; 

正規表現デモ:https://regex101.com/r/nwG2wW/4/
PHPデモ: `のvar_dump($ m)を使用して` $ m`にあるものhttps://3v4l.org/rkFUGd

+0

すばらしく見える:)括弧も削除する方法を教えてもらえますか? –

+0

この方法では角括弧は削除できません。これはあなたの試合の反対です。一致する場合は無視し、そうでない場合はコンテンツを選択して大文字にします。呼び出しの後に 'str_replace(array( '['、 ']')、 ''、$ text)'を実行することができます。 https://3v4l.org/1Yek0は、すべての角括弧を削除したいだけで、バランスがとれていないかどうかはチェックしません。 – chris85

0

[^][]++(?=\[|$)

Match a single character not present in the list below [^][]++ 
++ Quantifier — Matches between one and unlimited times, as many times as possible, without giving back (possessive) 
][ matches a single character in the list ][ (case sensitive) 
Positive Lookahead (?=\[|$) 
Assert that the Regex below matches 
1st Alternative \[ 
\[ matches the character [ literally (case sensitive) 
2nd Alternative $ 
$ asserts position at the end of the string, or before the line terminator right at the end of the string (if any) 
関連する問題