69

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

例 :

ABC (テスト 1)

(Test1)を削除してABCだけ残してほしい

ありがとう

4

7 に答える 7

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

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

正規表現の内訳:

/  - 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
于 2010-02-01T02:46:31.293 に答える
20

受け入れられた答えは、ネストされていない括弧に対してうまく機能します。正規表現をわずかに変更すると、ネストされた括弧で機能するようになります。

$string = "ABC (Test1(even deeper) yes (this (works) too)) outside (((ins)id)e)";
echo preg_replace("/\(([^()]*+|(?R))*\)/","", $string);
于 2015-08-03T13:06:37.330 に答える
13
$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

于 2012-05-30T00:44:57.807 に答える
13

正規表現なし

$string="ABC (test)"
$s=explode("(",$string);
print trim($s[0]);
于 2010-02-01T02:49:53.890 に答える
4

皆さん、正規表現を非正規言語の解析に使用することはできません。非正規言語は、状態を解釈する必要がある言語です (つまり、現在開いている括弧の数を覚えておく必要があります)。

上記の回答はすべて、「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

于 2010-02-01T07:09:33.993 に答える
3

最も簡単な方法 (preg なし):

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

単語の末尾のスペースを削除したくない場合は、コードからトリム関数を削除してください。

于 2016-10-19T12:28:39.800 に答える