извлечь все URL-адреса ссылок на файлы в список из строкового поля базы данных mysql

Мне нужно получить список всех URL-адресов файлов в одном из полей моей базы данных.

база данных mysql, article таблица

`id` | `subject` | `content`

значение content - это html-текст с одним или несколькими URL-адресами файла, например:

<p>this is the answer for ..., you can refer to below screenshot:</p>
<img src="http://the_url_of_image_here/imagename.jpg/>

<p>or refer to below document</p>

<a href="http://the_url_of_doc_here/guide.ppt>guide</a>
<a href="http://the_url_of_doc_here/sample.dox>sample</a>

есть 2 типа файлов

  1. изображение, с расширением jpg, jpeg, png, bmp, gif
  2. документ с расширением doc, docx, ppt, pptx, xls, xlsx, pdf, xps

Я сделал много глупостей, похоже, это сложно сделать только с mysql, php упростит это, я пишу свои коды, но это не может работать.

Спасибо cars10, решил.

function export_articles_link()
{
    global $date_from, $date_to;
    $filename = "kb_articles_link_".$date_from."_".$date_to.".xlsx";
    header('Content-disposition: attachment;        filename="'.XLSXWriter::sanitize_filename($filename).'"');
    header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    header('Content-Transfer-Encoding: binary');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    $query = 'SELECT `content` FROM `kb_articles` WHERE ((DATE(`dt`) BETWEEN \'' . $date_from . '\' AND \'' . $date_to . '\') AND (`content` LIKE \'%<img src=%\' or `content` LIKE \'%<a href="http:%\')) order by id asc';
    $result = mysql_query($query);
    $writer = new XLSXWriter(); 
    $img_list = array();
    while ($row=mysql_fetch_array($result))
    {
        $text = $row['content'];
        preg_match_all('!http://.+\.(?:jpe?g|png|gif|ppt?|xls?|doc?|pdf|xdw)!Ui', $text, $matches);
        $img_list = $matches[0];
        foreach ($img_list as $url)
        {
        $writer->writeSheetRow('Sheet1', array($url)); // if more than one url it will be put on first column
        }
    };
    $writer->writeToStdOut();
    exit(0);
}

поделитесь с другими, кому нужен образец работы, надеюсь, это сэкономит ваше время.


person user3009410    schedule 05.04.2017    source источник
comment
«Я пишу свои коды, но он не работает» в чем ошибка? проблема здесь?   -  person hassan    schedule 05.04.2017


Ответы (1)


Вы должны изменить свой центральный цикл на что-то вроде

$image_list=array(); // prepare an empty array for collection
while ($row=mysql_fetch_array($result))
{
    $text = $row['content'];
    preg_match_all('!http://.+?\.(?:jpe?g|png|gif|pptx?|xlsx?|docx?|pdf|xdw)!i', $s, $matches);
    $img_list=array_merge($image_list,$matches[0]);  // append to array       
}
$writer->writeSheetRow('Sheet1', $image_list);

Поскольку вы четко не указали что было неправильным, я просто догадался и пошел дальше: регулярное выражение немного отличается от вашего оригинала, а также способ, которым я структурировал цикл (да, только один нужен). preg_match_all нужно вызывать только один раз для каждого $text, а затем вы объединяете результаты из $matches[0] в свой $img_list-массив.

Я также удалил ваш U-модификатор, который инвертировал "жадность" всего регулярного выражения. Вместо этого я добавил ? после +, чтобы сделать этот квантификатор «нежадным».

Здесь я подготовил небольшую минималистичную демонстрацию: http://rextester.com/JDVMS87065

person Carsten Massmann    schedule 05.04.2017