web-dev-qa-db-ja.com

カッコ内のテキストを削除PHP

括弧のセットとphp内の括弧自体の間のテキストをどのように削除できるのか疑問に思っています。

例:

ABC(テスト1)

(Test1)を削除して、ABCのみを残すようにしたい

ありがとう

59
Belgin Fish
$string = "ABC (Test1)";
echo preg_replace("/\([^)]+\)/","",$string); // 'ABC '

preg_replaceはPerlベースの正規表現置換ルーチンです。このスクリプトが行うことは、開き括弧のすべての出現に一致し、任意の数の文字notが続き、閉じ括弧が続き、再び閉じ括弧が続き、それらを削除します。

正規表現の内訳:

/  - opening delimiter (necessary for regular expressions, can be any character that doesn't appear in the regular expression
\( - Match an opening parenthesis
[^)]+ - Match 1 or more character that is not a closing parenthesis
\) - Match a closing parenthesis
/  - Closing delimiter
149
cmptrgeekken

受け入れられた答えは、ネストされていない括弧に最適です。正規表現にわずかな変更を加えることで、ネストされた括弧で機能することができます。

$string = "ABC (Test1(even deeper) yes (this (works) too)) outside (((ins)id)e)";
echo preg_replace("/\(([^()]*+|(?R))*\)/","", $string);
13
Tegan Snyder
$string = "ABC (Test1(even deeper) yes (this (works) too)) outside (((ins)id)e)";
$paren_num = 0;
$new_string = '';
foreach($string as $char) {
    if ($char == '(') $paren_num++;
    else if ($char == ')') $paren_num--;
    else if ($paren_num == 0) $new_string .= $char;
}
$new_string = trim($new_string);

括弧をカウントして各文字をループすることで機能します。 $paren_num == 0(すべての括弧の外側にある場合)のみ、結果の文字列$new_stringに文字を追加します。

12
tyjkenn

正規表現なし

$string="ABC (test)"
$s=explode("(",$string);
print trim($s[0]);
12
ghostdog74

人々、正規表現は、非正規言語の解析には使用できません。非正規言語とは、解釈するために状態を必要とする言語です(つまり、現在開いている括弧の数を覚えている)。

上記の答えはすべて、「ABC(hello(world)how are you)」という文字列では失敗します。

Jeff AtwoodのParsing Html The Cthulhu Way: https://blog.codinghorror.com/parsing-html-the-cthulhu-way/ を読んでから、手書きのパーサー(ループスルー文字列内の文字、文字が括弧かどうかの確認、スタックの維持)、またはコンテキストフリー言語を解析できるレクサー/パーサーを使用します。

「適切に一致した括弧の言語」に関するこのウィキペディアの記事も参照してください。 https://en.wikipedia.org/wiki/Dyck_language

4
Alex Weinstein
$str ="ABC (Test1)";    
echo preg_replace( '~\(.*\)~' , "", $str );      
2
Naga

ほとんどのquikメソッド(pregなし):

$str='ABC (TEST)';
echo trim(substr($str,0,strpos($str,'(')));

Wordの末尾のスペースを削除したくない場合は、コードから削除機能を削除してください。

2
MERT DOĞAN