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

Тема в разделе "Регулярные выражения", создана пользователем RAPCorp, 14 мар 2017.

Модераторы: xpert13
  1. RAPCorp

    RAPCorp Постоялец

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

    Код:
    <p><img src="" /></p>
    и вставить его, а лучше содержимое src="" в соседнее поле. Можете подсказать как через регулярки выловить и вырезать первое вхождение картинки?
     
  2. alex_me

    alex_me

    Регистр.:
    25 янв 2017
    Сообщения:
    156
    Симпатии:
    104
    Как пример,
    вырезает первый таг 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''$fieldOne1);

        
    /*
          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];
        }, 
    $fieldTwo1);

        
    var_dump ($fieldTwoReplaced);
        
    /*
          '<p><img src="one" /></p><p><img src="four" /></p>'
        */
    Но это все равно ненадежно. 3k записей нужно перебирать DomDocument
     
  3. Delk0

    Delk0

    Регистр.:
    26 мар 2010
    Сообщения:
    291
    Симпатии:
    57
    Нужно вырезать с помощью php или вырезать с помощью SQL и вставить в соседний столбец?
     
  4. RAPCorp

    RAPCorp Постоялец

    Регистр.:
    12 сен 2012
    Сообщения:
    66
    Симпатии:
    5
    Если можно было бы одним SQL запросом обойтись для всей таблицы, было бы намного удобнее.
     
  5. Delk0

    Delk0

    Регистр.:
    26 мар 2010
    Сообщения:
    291
    Симпатии:
    57
    Можно обойтись вот таким запросом
    Код:
    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