foreach внутри для каждого (preg match url и imgurl)

0

У меня есть html в переменной ($ data) и найдите URL-адрес, который я называю $url и imgurl,

но я не могу понять, как найти URL-адрес для каждого элемента (он заканчивается повторением всех совпадений не для каждого).

Я пытаюсь изучить решение в целом, скажем, у вас есть html-страница, которую вы хотите извлечь img src и href src, и эхо все из них для каждого...

$data = "75http://upload.wikimedia.org/wikipedia/commons/7/7a/Britney_Spears_2013.jpg\46imgrefurl\75http://en.wikipedia.org/wiki/Britney_Spears\?imgurl\75http://www.spirituelquotes.com/wp-content/uploads/2014/12/britney-spears.jpg\46imgrefurl\75http://www.spirituelquotes.com/celebrities/britney-spears/";


//finds url; (below is code rough to give an idea ) 
 preg_match_all("/ru=\'(.*?)\'\;/is", $data, $matches); 
matches = $url;

 //finds imgurl
 preg_match_all("/imgurl%5C75(.*?)%5C/is", $data, $matches); 

 matches = $img;

 foreach $maches(){
 echo $url $img;  
 //whatever else you want to do
 }


output would be:

http://www.example.com http://www.example.com/image.jpg

http://www.example.com/dir/name2 http://www.example.com/image2.jpg

http://www.example.com/dir/name3 http://www.example.com/image3.jpg

http://www.example.com/dir/name3 http://www.example.com/image4.jpg

или:

$data = getfile contents(http://example.com)  

//finds url;
preg_match_all("/ru=\'(.*?)\'\;/is", $data, $matches); 
matches = $url

//finds the img url
 preg_match_all("/imgurl%5C75(.*?)%5C/is", $data, $matches); 

foreach($matches[1] as $imgurl){
 echo $imgurl $url and (basically want to echo url for each matches in foreach command)


 }

этот код работает, но я просто хочу добавить URL-адрес внутри каждого из них:

preg_match_all("/ru=\'(.*?)\'\;/is", $data, $matches); 
foreach($matches[1] as $url)


preg_match_all("/imgurl%5C75(.*?)%5C/is", $data, $matches); 
foreach($matches[1] as $imgurl){
$filename = basename($imgurl);

    echo $imgurl; //works
    echo $url; //displays all $urls found

$img = "$filename";

error_reporting(E_ALL);

$ch = curl_init(); 
$timeout = 0; 
curl_setopt ($ch, CURLOPT_URL, $imgurl); 
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 

$image = curl_exec($ch); 
curl_close($ch); 

$f = fopen($img, 'w');
fwrite($f, $image);
fclose($f);


}

}
}
  • 0
    Этот php файл работает или выдает какую-то ошибку. Смотрите строку после первых совпадений preg_match
  • 0
    Ваш псевдокод недостаточно понятен. Поскольку мы не знаем html-код, который вы пытаетесь проанализировать, мы не сможем вам помочь.
Показать ещё 2 комментария
Теги:
foreach

1 ответ

0
Лучший ответ

Попытка разобрать что-то сложное, как HTML с регулярными выражениями, всегда плохая идея. Вы должны использовать парсер для такой работы.

<?php

// Suppress errors on unknown elements.
libxml_use_internal_errors(true);

// Create a new libxml2 DOM document instance.
$domDocument = new \DOMDocument();

// Parse the HTML string.
$domDocument->loadHTML("<a href=http://www.example.com/dir/name><img src=http://www.example.com/image.jpg></a><a href=http://www.example.com/dir/name2><img src=http://www.example.com/image2.jpg></a><a href=http://www.example.com/dir/name3><img src=http://www.example.com/image3.jpg></a><a href=http://www.example.com/dir/name4><img src=http://www.example.com/image4.jpg></a>");

// Go through all DOM elements we are interested in.
foreach (array("a" => "href", "img" => "src") as $tagName => $attribute) {
    foreach ($domDocument->getElementsByTagName($tagName) as $domElement) {
        // Make sure the element has the desired attribute.
        if ($domElement->hasAttribute($attribute)) {
            echo $domElement->getAttribute($attribute) , PHP_EOL;
        }
    }
}

Обратите внимание, что libxml2 может вызывать ошибки, если вы попытаетесь проанализировать документ HTML5, содержащий некоторые из новых элементов. Вы можете обойти эту проблему, используя libxml_use_internal_errors.


Если вы настаиваете на использовании регулярных выражений или просто хотите изучать регулярные выражения (ознакомьтесь с regx101.com [no affiliation] для изучения регулярных выражений), то решением будет:

<?php

$data = "<a href=http://www.example.com/dir/name><img src=http://www.example.com/image.jpg></a><a href=http://www.example.com/dir/name2><img src=http://www.example.com/image2.jpg></a><a href=http://www.example.com/dir/name3><img src=http://www.example.com/image3.jpg></a><a href=http://www.example.com/dir/name4><img src=http://www.example.com/image4.jpg></a>";

preg_match_all("/(?:href|src)=(?:\"|')?([^\"'> ]*)(?:\"|'| |>)/", $data, $matches);

var_dump($matches);

/* OUTPUT:
array(2) {
  [0]=>
  array(8) {
    [0]=>
    string(37) "href=http://www.example.com/dir/name>"
    [1]=>
    string(37) "src=http://www.example.com/image.jpg>"
    [2]=>
    string(38) "href=http://www.example.com/dir/name2>"
    [3]=>
    string(38) "src=http://www.example.com/image2.jpg>"
    [4]=>
    string(38) "href=http://www.example.com/dir/name3>"
    [5]=>
    string(38) "src=http://www.example.com/image3.jpg>"
    [6]=>
    string(38) "href=http://www.example.com/dir/name4>"
    [7]=>
    string(38) "src=http://www.example.com/image4.jpg>"
  }
  [1]=>
  array(8) {
    [0]=>
    string(31) "http://www.example.com/dir/name"
    [1]=>
    string(32) "http://www.example.com/image.jpg"
    [2]=>
    string(32) "http://www.example.com/dir/name2"
    [3]=>
    string(33) "http://www.example.com/image2.jpg"
    [4]=>
    string(32) "http://www.example.com/dir/name3"
    [5]=>
    string(33) "http://www.example.com/image3.jpg"
    [6]=>
    string(32) "http://www.example.com/dir/name4"
    [7]=>
    string(33) "http://www.example.com/image4.jpg"
  }
}
*/
  • 0
    спасибо, но я попробовал, но он не поддерживает нестандартные теги ... imgurl \ 75http: //upload.wikimedia.org/wikipedia/commons/7/7a/Britney_Spears_2013.jpg \ 46imgrefurl \ 75http: //en.wikipedia .org / wiki / Britney_Spears \ imgurl \ 75http: //img2-3.timeinc.net/people/i/2012/news/121001/britney-spears-2-300.jpg \ 46imgrefurl \ 75http: //www.people .com / люди / статьи / 0,, 20737254,00.html \
  • 0
    Вы прочитали мой полный ответ? Я заявил, что вы можете использовать libxml_use_internal_errors если вам нужно проанализировать нестандартные теги. Я также расширил свой ответ с помощью регулярного выражения для вас.
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню