הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   עזרה עם regex (https://hosts.co.il/forums/showthread.php?t=98214)

link 27-06-12 22:31

עזרה עם regex
 
שלום לכולם,
אני תקוע במשהו עם ביטויים רגולרים ואני די בטוח שיש פה אנשים שיוכלו לעזור לי. בכל מקרה, יש לי textarea ואני רוצה שיהיה אפשר להכריז דרכו על פונקציות. הקטע הוא שאני צריך לפרסס את זה כדי שאני אוכל לבנות את זה מאוחר יותר. ז"א אם בן אדם רשם בטופס:

PHP קוד:

function foo($bar) {
  echo 
$bar;


אני צריך להוציא את השם של הפונקציה, את הארגיומנטים ואת התוכן. אשמח אם תוכלו לעזור לי בזה.

Haimz 28-06-12 08:13

קוד:

<?php

        $text = 'function  foo ($bar) {
                echo $bar;
                explode($arr, "");
        }';
       
        preg_match("/function.+?([a-zA-Z0-9_]+?)[\s]*\((.*?)\)[\s]*\{(.+?)\}/is", $text, $match);
       
        $match = array_map("trim", $match);
       
        $name = $match[1];
        $args = $match[2];
        $func = $match[3];
       
        echo "Name: $name<br />Args: $args<br />Func: $func";

?>

תהנה :] בדקתי זה עובד, אבל אני לא יודע איך זה עובד מול כמה פונקציות

link 28-06-12 13:50

תודה רבה, אבל יש בעיה אחת. אם בתוך הפונקציה עשו תנאי או לולאה, הסוגריים המסולסלים של הנ"ל שוברים את כל העסק.

יש לזה אולי פתרון?

בניה 28-06-12 14:33

אתה בעצם רוצה לכתוב PARSER לPHP... מציע לך למצוא פתרון יותר מוצלח.
אם אתה מתעקש, אתה יכול לשכתב ל PHP את הקוד C שבPARSER של PHP.

עריכה:
הייתי סקפטי מידי חחח נראה שמישהו עשה משהו כזה:
https://github.com/nikic/PHP-Parser

link 28-06-12 14:37

למה? מה הבעיה לפרק את הפונקציות לגורמים? זה לא משהו שהוא תמידי אלא בניייה של פונקציות בסשן הנוכחי

בניה 28-06-12 15:48

כי אתה מבצע פרסינג לקוד.
פרסינג זה לא להשתעשע עם ביטויים רגולארים, זה לתמוך בכל המאפיינים של הסינטקס של השפה ושל המבנה שלה.
אם לא תממש את הפרסר ב100%, אתה תמיד תגיע למצבי קצה שבהם הקוד שלך לא ידע לטפל.
בטח ובטח to יהיו שגיאות סינטקס של המשתמש.

זה תלוי כמה אתה באמת רוצה להשקיע בזה אתה יכול לחפש קוד מוכן(כמו זה שקישרתי אליו) ולקוות שהמימוש יהיה טוב

link 28-06-12 18:28

מה שהבאת הוא גדול מדי ומסועף מדי. אני צריך בסך הכול צריך לקחת את כל הפונקציות שהוגדרו בtextarea ולהפעיל אותם בכל פעם שדפים אחרים באתר נטענים. זה עוזר לדיבוג של דברים. הביטוי הרגולרי שסופק עשה את כל העבודה פרט לזה שהוא נכשל ברגע ששמתי איזה תנאי בתוך אחת הפונקציות.

Haimz 28-06-12 21:24

כן זה אפשרי, אבל זה יתמוך רק בפונקצייה אחת,

פשוט לשנות את הקוד ל:
קוד:

<?php

        $text = 'function  foo ($bar) {
                echo $bar;
                explode($arr, "");
        }';
       
        preg_match("/function.+?([a-zA-Z0-9_]+?)[\s]*\((.*?)\)[\s]*\{(.+)\}/is", $text, $match);
       
        $match = array_map("trim", $match);
       
        $name = $match[1];
        $args = $match[2];
        $func = $match[3];
       
        echo "Name: $name<br />Args: $args<br />Func: $func";

?>

אני לא בדקתי את זה אבל זה אמור לעבוד ..

Tomer 28-06-12 23:17

ציטוט:

נכתב במקור על ידי link (פרסם 849197)
מה שהבאת הוא גדול מדי ומסועף מדי. אני צריך בסך הכול צריך לקחת את כל הפונקציות שהוגדרו בtextarea ולהפעיל אותם בכל פעם שדפים אחרים באתר נטענים. זה עוזר לדיבוג של דברים. הביטוי הרגולרי שסופק עשה את כל העבודה פרט לזה שהוא נכשל ברגע ששמתי איזה תנאי בתוך אחת הפונקציות.

למה בעצם לא להשתמש ב eval?

link 29-06-12 16:48

ציטוט:

נכתב במקור על ידי Tomer (פרסם 849225)
למה בעצם לא להשתמש ב eval?

אני צריך לפרסס אותם בעצמי כי אלו פונקציות שיושבות בתוך סשן וככה אפשר למחוק אותם, לא להכריז עליהם - בקיצור שליטה מלאה עליהן.

אחר כך אני רץ על המשתנה ובונה אותם מחדש עם eval


כל הזמנים הם GMT +2. הזמן כעת הוא 07:51.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ