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

הוסטס - פורום אחסון האתרים הגדול בישראל (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=85538)

morsrh 07-10-10 13:43

הסתבכות עם REGEX.
 
טוב אז כבר ניסית הכל אבל לא הולך לי.
כעקרון מה שאני עושה זה לקבל תוכן של אתר ע"י file_get_contents ואז להוריד ממנו את ה- IFRAME ממנו ואז להדפיס , ככה שמה שיצא כשאני מדפיס אותו הוא האתר ללא ה- IFRAMES וללא התוכן שלו.

אשמח אם מישהו יכול להביא לי איזה קוד שיכול לסדר את זה.
מה שיצא לי עד עכשיו זה זה :
PHP קוד:

function strip_only($str$tags$stripContent false)
{
    
$content '';
    if(!
is_array($tags))
    {
        
$tags = (strpos($str'>') !== false explode('>'str_replace('<'''$tags)) : array($tags));
        if(
end($tags) == ''array_pop($tags);
    }
    foreach(
$tags as $tag)
    {
        if (
$stripContent)
             
$content '(.+</'.$tag.'[^>]*>|)';
         
$str preg_replace('#</?'.$tag.'[^>]*>'.$content.'#is'''$str);
    }
    return 
$str;


ובכל זאת זה מוריד לי חצי מהאתר.
אשמח לעזרה , אני מתחיל להתיאש מזה.
תודה , מור.

BlueNosE 07-10-10 14:37

לא תקבל פה קוד מוכן.
נסה לחפש באינטרנט, להשתמש בביטויים לא חמדניים
קוד:

.*?    ///    .+?
או
~expression~U

ואולי לעבוד עם strip_tags יעזור לך.

BAMB 07-10-10 14:45

ציטוט:

נכתב במקור על ידי BlueNosE (פרסם 782366)
לא תקבל פה קוד מוכן.
נסה לחפש באינטרנט, להשתמש בביטויים לא חמדניים
קוד:

.*?    ///    .+?
או
~expression~U

ואולי לעבוד עם strip_tags יעזור לך.

מה זה הקוד שהבאת?

morsrh 07-10-10 15:34

strip tags לא עוזר.
ניסיתי לחפש את מה שהבאת אבל זה מביא תוצאות לא רלוונטיות.
אפשר אולי איזה לינק?

BlueNosE 07-10-10 15:59

ציטוט:

נכתב במקור על ידי BAMB (פרסם 782367)
מה זה הקוד שהבאת?

קוד:

<hello> i'm <omer>
ניקח מצב לדוגמא בו אתה צריך לשלוף את כל מה שבין < ל->.
קוד:

<(.*)>
כל מתכנת מנוסה ישים לב שהביטוי הבא יתן תוצאה בודדת והיא hello> i'm <omer.
התכונה הזו של ביטויים רגולריים נקראת חמדנות.

ישנן 2 דרכים לטפל בחמדנות. האחת פשוטה למימוש גם בקטעים קיימים, אבל היא עובדת עם מודיפיקטור U - Ungreedy. אני מעדיף להשתמש בשיטה השניה:
קוד:

<(.*?)>
שים לב להבדל הקטן. כעת יתקבלו 2 תשובות: hello, omer.

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

ציטוט:

נכתב במקור על ידי iwnfyM (פרסם 782370)
strip tags לא עוזר.
ניסיתי לחפש את מה שהבאת אבל זה מביא תוצאות לא רלוונטיות.
אפשר אולי איזה לינק?

בשביל להבין מה אתה מבקש. אתה רוצה להוציא את תגי הIFRAME ואותם בלבד מהעמוד?

morsrh 07-10-10 16:16

בדיוק .

BlueNosE 07-10-10 18:27

אז למה הפונקציה? הקוד שאתה בונה צריך לכלול את הביטוי הבא:
-פתיחת תג IFRAME (כלומר <iframe )
-נתונים בתוכו (SRC, FRAMEBORDER וכו')
-סגירת תג IFRAME (כלומר >)
-תוכן בין התג הפותח לתג הסוגר
-תג סוגר (</iframe>).

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

morsrh 07-10-10 18:49

חיפשתי ככה בהתחלה :
PHP קוד:

'/\<{1}iframe(.*)\<{1}\/{1}iframe\>{1}/' 

אבל זה הוריד לי חצי מהאתר.

BlueNosE 07-10-10 18:57

קוד:

~<\s*iframe(.*?)>.*?<\s*/\s*iframe>~
משהו בסגנון הזה (למה לכמת את הקצוות ב{1}?)

morsrh 07-10-10 19:12

ציטוט:

נכתב במקור על ידי BlueNosE (פרסם 782395)
קוד:

~<\s*iframe(.*?)>.*?<\s*/\s*iframe>~

קוד:

Unknown modifier '.'
מה זאת אומרת השאלה? למה לא?

BlueNosE 07-10-10 20:44

לא יודע מה עשית. השתמשתי ב~~ במקום ב//, אולי עשית משהו אחר. לפי זה יש לך אחרי הסגירה נקודה בלי סיבה.

morsrh 07-10-10 21:40

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

BlueNosE 08-10-10 15:02

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

Erez | TrustMedia.co.il 08-10-10 15:14

אם היית מסתכל בתגובות לפונקציה strip_tags היית מוצא לא מעט פתרונות כאלו:
PHP קוד:

<?php
function strip_only($str$tags$stripContent false) {
    
$content '';
    if(!
is_array($tags)) {
        
$tags = (strpos($str'>') !== false explode('>'str_replace('<'''$tags)) : array($tags));
        if(
end($tags) == ''array_pop($tags);
    }
    foreach(
$tags as $tag) {
        if (
$stripContent)
             
$content '(.+</'.$tag.'[^>]*>|)';
         
$str preg_replace('#</?'.$tag.'[^>]*>'.$content.'#is'''$str);
    }
    return 
$str;
}

$str '<font color="red">red</font> text';
$tags 'font';
$a strip_only($str$tags); // red text
$b strip_only($str$tagstrue); // text
?>

PHP קוד:

function strip_selected_tags($str$tags ""$stripContent false)
{
    
preg_match_all("/<([^>]+)>/i"$tags$allTagsPREG_PATTERN_ORDER);
    foreach (
$allTags[1] as $tag) {
        
$replace "%(<$tag.*?>)(.*?)(<\/$tag.*?>)%is";
        
$replace2 "%(<$tag.*?>)%is";
        echo 
$replace;
        if (
$stripContent) {
            
$str preg_replace($replace,'',$str);
            
$str preg_replace($replace2,'',$str);
        }
            
$str preg_replace($replace,'${2}',$str);
            
$str preg_replace($replace2,'${2}',$str);
    }
    return 
$str;


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

intercooler3819 09-10-10 12:27

תעשה ככה
קוד:

~<\s*iframe.*>.*<\s*/\s*iframe\s*>~Uis
לא ניסיתי אמור לעבוד

בהצחה

intercooler3819 09-10-10 12:31

ציטוט:

נכתב במקור על ידי BlueNosE (פרסם 782395)
קוד:

~<\s*iframe(.*?)>.*?<\s*/\s*iframe>~
משהו בסגנון הזה (למה לכמת את הקצוות ב{1}?)

קח בחשבון להוסיף את המודיפיקטור i שגורם ל INcaseSENSITIVE שיגרום גם לתפיסה של
iFRaME
ולא רק iframe

בנוסף שימוש במודיפיקטור U שגורם לדברים כמו .+ לא להיות חמדניים אובר על המידה ולתפוס דברים שאתה לא צריך
בנוסף יש את המודיפיקטור s קטנה שאומר שנקודה יכולה לתפוס גם תווים לבנים כמו \t \n \r רווחים וכו'

בנוסף, אני לא חושב שזה תיקני לשים רווחים בין הסוגר המשולש הראשון ל iframe כלומר ככה:
< iframe

קיבצתי הכל לביטוי אחד שאמור לתפוס הכל בתגובה הקודמת, אף על פי שאני לא חושב שצריך להשתמש ב \s* בין הסוגרים אבל תפאדל

בהצלחה עם זה

שבוע טוב

BlueNosE 09-10-10 13:44

ציטוט:

נכתב במקור על ידי nitsanbn (פרסם 782535)
קח בחשבון להוסיף את המודיפיקטור i שגורם ל INcaseSENSITIVE שיגרום גם לתפיסה של
iFRaME
ולא רק iframe

בנוסף שימוש במודיפיקטור U שגורם לדברים כמו .+ לא להיות חמדניים אובר על המידה ולתפוס דברים שאתה לא צריך
בנוסף יש את המודיפיקטור s קטנה שאומר שנקודה יכולה לתפוס גם תווים לבנים כמו \t \n \r רווחים וכו'

בנוסף, אני לא חושב שזה תיקני לשים רווחים בין הסוגר המשולש הראשון ל iframe כלומר ככה:
< iframe

קיבצתי הכל לביטוי אחד שאמור לתפוס הכל בתגובה הקודמת, אף על פי שאני לא חושב שצריך להשתמש ב \s* בין הסוגרים אבל תפאדל

בהצלחה עם זה

שבוע טוב

תקרא את מה שרשמתי בעמוד הקודם, דיי מילה במילה מה שרשמת פה.
לגבי i , אין ממש צורך אם הוא מכיר את האתר ויודע שהוא משתמש ב<iframe>.
אגב, .*? זה כמו .* עם U. קרא על זה בעמוד הקודם.

intercooler3819 09-10-10 14:10

ציטוט:

נכתב במקור על ידי BlueNosE (פרסם 782540)
תקרא את מה שרשמתי בעמוד הקודם, דיי מילה במילה מה שרשמת פה.
לגבי i , אין ממש צורך אם הוא מכיר את האתר ויודע שהוא משתמש ב<iframe>.
אגב, .*? זה כמו .* עם U. קרא על זה בעמוד הקודם.

את האמת לא ראיתי את הסימן שאלה |Lol| חוסר שעות שינה כדי שאני ארדם בערב (מחר גיבוש טיס)

BlueNosE 09-10-10 14:39

פשש סחטיין, שיהיה בהצלחה (:


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

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