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

RAPCorp

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

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

и вставить его, а лучше содержимое src="" в соседнее поле. Можете подсказать как через регулярки выловить и вырезать первое вхождение картинки?
 
Как пример,
вырезает первый таг 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
 
Нужно вырезать с помощью php или вырезать с помощью SQL и вставить в соседний столбец?
 
Нужно вырезать с помощью php или вырезать с помощью SQL и вставить в соседний столбец?
Если можно было бы одним SQL запросом обойтись для всей таблицы, было бы намного удобнее.
 
Можно обойтись вот таким запросом
Код:
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
 
Назад
Сверху