سؤال

أنا فقط أتساءل كيف يمكن إزالة النص بين مجموعة من الأقواس و الأقواس أنفسهم في php.

على سبيل المثال :

ABC (Test1)

أود أن حذف (Test1) و ترك فقط ABC

شكرا

هل كانت مفيدة؟

المحلول

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

preg_replace هو بيرل على أساس التعبير العادية محل الروتينية.ما هذا السيناريو لا يطابق جميع الحوادث من فتح قوسين ، تليها أي عدد من الأحرف لا قوس إغلاق ، ومرة أخرى تليها قوس إغلاق ثم يحذف منها:

التعبير العادي تفصيل:

/  - 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

نصائح أخرى

الإجابة المقبولة تعمل بشكل رائع بالنسبة للأقواس غير المتداخلة. يتيح تعديل طفيف لـ Regex العمل على قوسين متداخلين.

$string = "ABC (Test1(even deeper) yes (this (works) too)) outside (((ins)id)e)";
echo preg_replace("/\(([^()]*+|(?R))*\)/","", $string);

بدون regex

$string="ABC (test)"
$s=explode("(",$string);
print trim($s[0]);
$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.

الناس ، لا يمكن استخدام التعبيرات العادية لتحليل اللغات غير النظامية. اللغات غير المنهجية هي تلك التي تتطلب من الدولة تفسير (أي تذكر عدد الأقواس المفتوحة حاليًا).

ستفشل جميع الإجابات المذكورة أعلاه في هذه السلسلة: "ABC (Hello (World) كيف حالك)".

اقرأ Jeff Atwood's Parsing Html the Cthulhu Way: https://blog.codinghorror.com/parsing-html-the-cthulhu-way/, ، ثم استخدم إما محلل مكتوب باليدين (حلقة من خلال الأحرف الموجودة في السلسلة ، ومعرفة ما إذا كان الحرف هو قوسين أم لا ، الحفاظ على مكدس) أو استخدم Lexer/محلل قادر على تحليل لغة خالية من السياق.

انظر أيضًا مقالة ويكيبيديا حول "لغة الأقواس المتطابقة بشكل صحيح:" https://en.wikipedia.org/wiki/dyck_language

معظم طريقة Quik (بدون preg):

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

إذا كنت لا ترغب في تقليم المساحات في نهاية الكلمة ، فما عليك سوى إزالة وظيفة القطع من التعليمات البرمجية.

$str ="ABC (Test1)";    
echo preg_replace( '~\(.*\)~' , "", $str );      
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top