Как вырезать из HTML только первую ссылку?

RAPCorp

Постоялец
Регистрация
12 Сен 2012
Сообщения
71
Реакции
10
Всем привет! Возникла одна проблемка. Имеется база с 3к записями, нужно в одном поле, где присутствует текст с тэгами, скопировать самое первое вхождение

Код:
<p><img src="" /></p>

и вставить его, а лучше содержимое src="" в соседнее поле. Можете подсказать как через регулярки выловить и вырезать первое вхождение картинки?
 

alex_me

Постоялец
Регистрация
25 Янв 2017
Сообщения
172
Реакции
130
Как пример,
вырезает первый таг p c img из первого поля,
запоминает src, вставляет его в первый p с img во втором поле

PHP:
$fieldOne = '<p><img src="one" alt="alt1" /></p><p><img src="two" alt="alt2" /></p>';
$fieldTwo = '<p><img src="three" /></p><p><img src="four" /></p>';

$patternToFind = '/<p>[\s\r\n]*?<img((?:(?!src).)+)src="([^"]+)"[^>]+>[\s\r\n]*?<\/p>/i';
$patternToReplace = '/(<p>[\s\r\n]*?<img((?:(?!src).)+)src=")([^"]+)("[^>]+>[\s\r\n]*?<\/p>)/i';

$match = preg_match($patternToFind, $fieldOne, $matches);

/*
  var_dump($match);
  array (
  0 => '<p><img src="one" alt="alt1" /></p>',
  1 => ' ',
  2 => 'one',
  )
*/


if ($match) {
    $replacement = $matches[2];
    // Удаляем
    $fieldOneReplaced = preg_replace($patternToFind, '', $fieldOne, 1);

    /*
      var_dump($fieldOneReplaced);
      '<p><img src="two" alt="alt2" /></p>'
     */

    // Вставляем
    $fieldTwoReplaced = preg_replace_callback($patternToReplace,
            function($matches) use ($replacement) {
        return $matches[1] . $replacement . $matches[4];
    }, $fieldTwo, 1);

    var_dump ($fieldTwoReplaced);
    /*
      '<p><img src="one" /></p><p><img src="four" /></p>'
    */

Но это все равно ненадежно. 3k записей нужно перебирать DomDocument
 

Delk0

Гуру форума
Регистрация
26 Мар 2010
Сообщения
290
Реакции
67
Нужно вырезать с помощью php или вырезать с помощью SQL и вставить в соседний столбец?
 

RAPCorp

Постоялец
Регистрация
12 Сен 2012
Сообщения
71
Реакции
10
Нужно вырезать с помощью php или вырезать с помощью SQL и вставить в соседний столбец?
Если можно было бы одним SQL запросом обойтись для всей таблицы, было бы намного удобнее.
 

Delk0

Гуру форума
Регистрация
26 Мар 2010
Сообщения
290
Реакции
67
Можно обойтись вот таким запросом
Код:
UPDATE `test_table`
SET `result` = SUBSTRING(
    txt,
    LOCATE('<img src="', txt) + 10,
    LOCATE('"', txt, LOCATE('<img src="', txt) + 11) - (LOCATE('<img src="', txt) + 10)
)
WHERE txt REGEXP '<p><img src="'
Вырезает из поля txt все что находится между img src=" и " и вставляет в поле result
 
Сверху