Почему я получаю массив объектов SimpleXMLElement здесь? - PullRequest
3 голосов
/ 14 апреля 2011

У меня есть код, который извлекает 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 ()?

Спасибо

РЕДАКТИРОВАТЬ: Хотя я понимаю, что ответы совпадают с тем, что я спрашиваю (я наградил), я больше хотел бы знать, почему при использовании array_push или другой нотации добавляется объект SimpleXMLElement, а не строка, когда оба не брошены. Я знал, что при явном приведении к строке я получу строку. Смотрите следующий вопрос: Почему эти значения не добавляются в мой массив в виде строк?

Ответы [ 3 ]

3 голосов
/ 14 апреля 2011

Разница не в array_push(), а в приведении типа , которое вы используете во втором случае .


В первом цикле выиспользуя:

array_push($sources, $i['src']);

Что означает вы добавляете SimpleXMLElement объекты в ваш массив.


В то время как во втором цикле вы используете:

$sources[] = (string)$i['src'];

Что означает (благодаря приведению к строке) , что вы добавляете строки в свой массив - и больше не SimpleXMLElement объекты.


Для справки: соответствующий раздел руководства: Тип литья .

1 голос
/ 14 апреля 2011

Извините, только что заметил лучшие ответы выше, но само регулярное выражение все еще в силе.Вы пытаетесь получить все изображения в разметке 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);
                }

        }
0 голосов
/ 14 апреля 2011

В первом примере вы должны:

array_push($sources, (string) $i['src']);

Во втором примере представлен массив строк, потому что вы преобразовываете SimpleXMLElements в строки, используя приведение (string).В первом примере это не так, поэтому вместо этого вы получаете массив SimpleXMLElements.

...