У меня есть 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);
}
}
}
Попытка разобрать что-то сложное, как 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"
}
}
*/
libxml_use_internal_errors
если вам нужно проанализировать нестандартные теги. Я также расширил свой ответ с помощью регулярного выражения для вас.