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

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

dor77 14-03-14 13:53

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

PHP קוד:

Undefined offset1 in D:wampwwwcurl.php on line 29 

זו שורה 29:

PHP קוד:

echo $match[1]; 

הנה הקוד:

PHP קוד:


function get_source_code($url)
{
  
$ch curl_init();
  
$useragent="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1)".
                            
" Gecko/20061204 Firefox/2.0.0.1";
  
  
curl_setopt($chCURLOPT_URL$url);
  
curl_setopt($chCURLOPT_HEADER0);
  
curl_setopt($chCURLOPT_USERAGENT$useragent);
  
curl_setopt($chCURLOPT_RETURNTRANSFER1);    
  
  
$source_code curl_exec($ch);
  
  
curl_close($ch);
  
$source_code nl2br(htmlspecialchars($source_code));
}

$s_c get_source_code('http://www.blabla.com');

$start '<div id="login">';
$end '<div id="search">';
preg_match('/'.preg_quote($start).'(.*?)'.preg_quote($end).'/is'$s_c$match);
echo 
$match[1]; 


אשמח לעזרה, תודה.

בניה 15-03-14 12:30

למה ה nl2br(htmlspecialchars(?

השגיאה מרמזת על זה שהביטוי רגולרי לא מצא את מה שאתה רוצה שהוא ימצא לכן במערך של התוצאות אין את התא 1

dor77 15-03-14 12:34

אוקייף הסרתי את שתי הפוקנציות האלה..
גם עכשיו, שגיאה.

PHP קוד:


function get_source_code($url)
{
  
$ch curl_init();
  
$useragent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36";
  
  
curl_setopt($chCURLOPT_URL$url);
  
curl_setopt($chCURLOPT_HEADER0);
  
curl_setopt($chCURLOPT_USERAGENT$useragent);
  
curl_setopt($chCURLOPT_RETURNTRANSFER1);
  
  
$source_code curl_exec($ch);
  
  
curl_close($ch);
  
$source_code $source_code;
  return 
$source_code;
}

$s_c get_source_code('http://www.blabla.com');

$start '<li class="menu"><a href="#">';
$end '</a>';
preg_match('/'.preg_quote($start).'(.*?)'.preg_quote($end).'/is'$s_c$match);
echo 
$match[1]; 

הstart וend מופיעים ככה בקוד מקור, אני מנסה לקבל את מה שבניהם.
עכשיו אני מקבל:

PHP קוד:

Warningpreg_match(): Unknown modifier 'a' in D:wampwwwcurl.php on line 24 

תודה רבה!

בניה 15-03-14 12:39

את ה preg_quote תעשה ככה:
PHP קוד:

preg_quote($val'/'

ותקרא בתיעוד מה זה עושה
http://il1.php.net/preg_quote

dor77 15-03-14 12:54

רק ל start?
ככה:

PHP קוד:

preg_match(preg_quote($start'/').'(.*?)'.preg_quote($end).'/is'$s_c$match); 

או גם לend, ככה:

PHP קוד:

preg_match(preg_quote($start'/').'(.*?)'.preg_quote($end'/').'/is'$s_c$match); 

זה אמור לסדר את הקטע של הסלאשים?
עדיין שגיאה..

בניה 15-03-14 12:57

ציטוט:

נכתב במקור על ידי dor77 (פרסם 887467)
רק ל start?
ככה:

PHP קוד:

preg_match(preg_quote($start'/').'(.*?)'.preg_quote($end).'/is'$s_c$match); 

או גם לend, ככה:

PHP קוד:

preg_match(preg_quote($start'/').'(.*?)'.preg_quote($end'/').'/is'$s_c$match); 

זה אמור לסדר את הקטע של הסלאשים?
עדיין שגיאה..

שניהם...
תקרא מה זה עושה. זה עושה escape גם ל delimiter שלך
מה השגיאה עכשיו?

dor77 15-03-14 13:01

זו השגיאה:

PHP קוד:

preg_match(): Delimiter must not be alphanumeric or backslash in D:wampwwwcurl.php on line 24 

זה מה שעשיתי:

PHP קוד:

preg_match(preg_quote($start'/').'(.*?)'.preg_quote($end'/').'/is'$s_c$match); 


בניה 15-03-14 13:44

תחזיר את ה / זה הדלימיטר, והוא צריך להיות גם בתור פרמטר ל preg_quote

dor77 15-03-14 14:08

בדיוק שמתי לב והחזרתי אותו רבל יש בעיה אחת..הוא אכן מציג את המ שאני רוצה אבל כאשר אני נותן לstart ו end ערכים כמו:

PHP קוד:

$start '</ul>
            </li>
            <li class="menu-item"><a href="store.php">'
;
$end '</a></li>
          </ul>
        </nav>
    </div>'
;
preg_match('/'.preg_quote($start'/').'(.*?)'.preg_quote($end'/').'/is'$s_c$match);
echo 
$match[1]; 

אני מקבל שגיאה:

PHP קוד:

Undefined offset1 in D:wampwwwcurl.php on line 45 

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

וזו השורה:

PHP קוד:

echo $match[1]; 

שוב, אם הייתי נותן ערכים כאלו:

PHP קוד:

$start '<span class="name">';
$end '</span>'

זה עובד מעולה.
ה preg_match שלי כתוב נכון?

PHP קוד:

preg_match('/'.preg_quote($start'/').'(.*?)'.preg_quote($end'/').'/is'$s_c$match); 

תודה רבה.

בניה 15-03-14 14:15

חשוב להבין משהו "Undefined offset:"
זו לא שגיאה של תקלה בקוד אלא פשוט הוא לא מוצא לפי הקלט שהבאת לו, ואתה צריך לשחק עם הSTART/END ואולי גם לכתוב ביטוי רגולרי יותר מתוחכם.

וגם ירידת שורה נחשב תו שהביטוי רגולרי אמור לתפוס.

אם אתה רוצה לנסות לעשות לעצמך חיים יותר קלים אפשר לעשות STRIP לירידות שורה

משהו כזה:
PHP קוד:

str_replace(array("\r""\n"), ''$string

http://stackoverflow.com/a/6766580/711152

dor77 15-03-14 14:28

לעשות את זה לstart ו end או לקוט מקור שמוחזר מהפונקציה?

בניה 15-03-14 14:58

ציטוט:

נכתב במקור על ידי dor77 (פרסם 887473)
לעשות את זה לstart ו end או לקוט מקור שמוחזר מהפונקציה?

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

dor77 15-03-14 15:17

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

PHP קוד:

function get_source_code($url)
{
  
$ch curl_init();
  
$useragent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36";
  
  
curl_setopt($chCURLOPT_URL$url);
  
curl_setopt($chCURLOPT_HEADER0);
  
curl_setopt($chCURLOPT_USERAGENT$useragent);
  
curl_setopt($chCURLOPT_RETURNTRANSFER1);
  
  
$source_code curl_exec($ch);
  
  
curl_close($ch);
  
$source_code str_replace(array("\r""\n"), ''$source_code);

  return 
$source_code;


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

PHP קוד:

$start '<li class="menu-item"><a href="#">PRODUCT</a>              <ul class="dropdown">                <li class="menu-item sub-menu"><a href="link.php">';
$end '</a></li>'

אין דרך יותר נוחה מאשר להקפיד להשאיר את הטאבים האלו?

תודה רבה לך, מעריך מאוד!

dor77 15-03-14 16:15

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


PHP קוד:

function get_source_code($url)
{
  
$ch curl_init();
  
$useragent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36";
  
  
curl_setopt($chCURLOPT_URL$url);
  
curl_setopt($chCURLOPT_HEADER0);
  
curl_setopt($chCURLOPT_USERAGENT$useragent);
  
curl_setopt($chCURLOPT_RETURNTRANSFER1);
  
  
$source_code curl_exec($ch);
  
  
curl_close($ch);
  
$source_code str_replace(array("\r""\n"), ''$source_code);

  return 
$source_code;
}

$s_c get_source_code('http://www.bla.com');
$s_c preg_replace('~>\s+<~m''><'$s_c);

$start '<div id="menu">
            <ul class="menu">
                <li>'
;
$end '</li>';


$start preg_replace('~>\s+<~m''><'$start);
$end preg_replace('~>\s+<~m''><'$end);

preg_match('/'.preg_quote($start'/').'(.*?)'.preg_quote($end'/').'/is'$s_c$match);
echo 
$match[1]; 


zoharesh 15-03-14 20:40

למה לעבוד בצורה כזו?
תעבוד עם DOM Document
http://il1.php.net/manual/en/class.domdocument.php

dor77 15-03-14 20:50

ציטוט:

נכתב במקור על ידי zoharesh (פרסם 887479)
למה לעבוד בצורה כזו?
תעבוד עם DOM Document
http://il1.php.net/manual/en/class.domdocument.php

אפשר לדעת מה הבעיה בשיטה הזו?
והאמת שלא מצאתי שם משהו שממש מתאים..יש לך דוגמא אולי?

תודה.

zoharesh 16-03-14 01:04

לא בדקתי, אבל משהו כזה אמור לעבוד:
PHP קוד:

<?php
$sc 
"<html>....."// source code here
$dom = new DOMDocument();
$dom->strictErrorChecking false// don't check for html errors
$dom->loadHTML($sc);
$menu $dom->getElementById('menu');
$li $menu->getElementsByTagName('li');
$final = [];
foreach(
$li as $l)
  
$final[] = $l->nodeValue;

יוציא לך את הטקסט של כל תגי ה-li במערך.

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

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

בניה 16-03-14 11:09

ציטוט:

נכתב במקור על ידי zoharesh (פרסם 887484)
לא בדקתי, אבל משהו כזה אמור לעבוד:
PHP קוד:

<?php
$sc 
"<html>....."// source code here
$dom = new DOMDocument();
$dom->strictErrorChecking false// don't check for html errors
$dom->loadHTML($sc);
$menu $dom->getElementById('menu');
$li $menu->getElementsByTagName('li');
$final = [];
foreach(
$li as $l)
  
$final[] = $l->nodeValue;

יוציא לך את הטקסט של כל תגי ה-li במערך.

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

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

לעבוד עם DOM בצורה כזו זה מאוד גמיש וחזק, אבל קצת OVERKILL וצורך הרבה יותר משאבים למקרה הספציפי הזה מאשר ביטוי רגולארי פשוט

zoharesh 16-03-14 11:34

אני לא בטוח במה שאתה אומר, יש לו שם 4 ביטויים רגולאריים.
יהיה מעניין לעשות ל2 הקודים השוואת ביצועים :)


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

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