У меня есть код, который вытягивает HTML из внешнего источника:
$doc = new DOMDocument(); @$doc->loadHTML($html); $xml = @simplexml_import_dom($doc); // just to make xpath more simple $images = $xml->xpath('//img'); $sources = array();
Затем, если я добавлю все источники с этим кодом:
foreach ($images as $i) { array_push($sources, $i['src']); } echo "<pre>"; print_r($sources); die();
Я получаю этот результат:
Array ( [0] => SimpleXMLElement Object ( [0] => /images/someimage.gif ) [1] => SimpleXMLElement Object ( [0] => /images/en/someother.jpg ) .... )
Но когда я использую этот код:
foreach ($images as $i) { $sources[] = (string)$i['src']; }
Я получаю этот результат (это то, что нужно):
Array ( [0] => /images/someimage.gif [1] => /images/en/someother.jpg ... )
Что вызывает эту разницу? Что отличает нас от array_push ()?
Благодаря,
EDIT: Хотя я понимаю, что ответы соответствуют тому, что я прошу (я получил), мне больше хотелось знать, почему использование array_push или другой нотации добавляет объект SimpleXMLElement, а не строку, когда оба arent литые. Я знал, что при явном нажатии на строку я получаю строку. Смотрите следующий вопрос: почему эти значения не добавляются в мой массив как строки?
Разница не вызвана array_push()
но при использовании типа-cast, который вы используете во втором случае .
В первом цикле вы используете:
array_push($sources, $i['src']);
Это означает, что вы добавляете объекты SimpleXMLElement
в свой массив.
Хотя во втором цикле вы используете:
$sources[] = (string)$i['src'];
Это означает (благодаря приведению в строку) , что вы добавляете строки в свой массив, а не объекты SimpleXMLElement
.
В качестве справки: соответствующий раздел руководства: Type Casting .
Извините, только что заметили лучшие ответы выше, но само regex по-прежнему действует. Вы пытаетесь получить все изображения в разметке HTML? Я знаю, что вы используете PHP, но вы можете конвертировать этот пример C #, куда идти:
List<string> links = new List<string>(); if (!string.IsNullOrEmpty(htmlSource)) { string regexImgSrc = @"<img[^>]*?src\s*=\s*[""']?([^'"" >]+?)[ '""][^>]*?>"; MatchCollection matchesImgSrc = Regex.Matches(htmlSource, regexImgSrc, RegexOptions.IgnoreCase | RegexOptions.Singleline); foreach (Match m in matchesImgSrc) { string href = m.Groups[1].Value; links.Add(href); } }
В первом примере вы должны:
array_push($sources, (string) $i['src']);
Второй пример дает массив строк, потому что вы преобразовываете SimpleXMLElements в строки, используя (string)
cast. В вашем первом примере вы этого не сделаете, поэтому вместо этого вы получите массив SimpleXMLElements.