Поддержка Проблемы и решения помогите с регуляркой

  • вот такая регулярка:

    
    $pattern = "/<([a-z][a-z0-9]*)(?:[^>]*(\ssrc=['\"][^'\"]*['\"]))?[^>]*?(\/?)>/i";
    $replacement = '<$1$2$3>';
    $content = preg_replace($pattern, $replacement, $content);
    

    удаляет из тега img все, кроме атрибута src.
    как к исключениям добавить alt?
    то есть чтобы оставалось src и alt (если он был указан или вообще пропущен).

Просмотр 6 ответов — с 1 по 6 (всего 6)
  • Говорят что эта идея не очень, посмотри тут https://stackoverflow.com/questions/138313/how-to-extract-img-src-title-and-alt-from-html-using-php

    Модератор Yuri

    (@yube)

    Лучше разобрать и собрать заново.

    да если бы я умел, я бы разобрал 🙂
    сижу вот на https://regex101.com, пытаюсь придумать, но ничего не выходит 🙁

    Порядок следования alt важен? или структура там всегда постоянная? например такая img alt title src?

    порядок следования совершенно не важен.
    была бы структура постоянной — я бы просто обрезал ненужное, но там и alt и src может быть в любом порядке.

    ну вот кто его знает, пользователей то, как они захреначат картинку?
    если бы только в редакторе — было бы проще.
    а так вставляют вручную в режиме Текст без того же alt и ищи его 🙁
    или плагины те же — свой формат оформления картинок 🙁

    чтобы оставить только src в img — уже навалом кода нашел.
    но чтобы и src и alt — все никак не удается.

    короче, переделал одну функцию, хрен знает правильно или нет.

    
    function stripAttributes($s, $allowedattr = array()) {
      if (preg_match_all("/<img[^>]*\\s([^>]*)\\/*>/msiU", $s, $res, PREG_SET_ORDER)) {
       foreach ($res as $r) {
         $tag = $r[0];
         $attrs = array();
         preg_match_all("/\\s.*=(['\"]).*\\1/msiU", " " . $r[1], $split, PREG_SET_ORDER);
         foreach ($split as $spl) {
          $attrs[] = $spl[0];
         }
         $newattrs = array();
         foreach ($attrs as $a) {
          $tmp = explode("=", $a);
          if (trim($a) != "" && (!isset($tmp[1]) || (trim($tmp[0]) != "" && !in_array(strtolower(trim($tmp[0])), $allowedattr)))) {
    
          } else {
              $newattrs[] = $a;
          }
         }
        
         sort($newattrs);
         reset($newattrs);
    
         $attrs = implode(" ", $newattrs);
         $rpl = str_replace($r[1], $attrs, $tag);
         $s = str_replace($tag, $rpl, $s);
       }
      }
    
       //удаляем двойные пробелы в тексте 
       $s = preg_replace('/\s+/', ' ',$s);    
      
       //var_dump($s);
    
      return $s;
    }
    

    вызывается так:

    
    $content = stripAttributes($content,array('alt','src'));
    

    вроде работает, но насколько это правильно тот еще вопрос.

Просмотр 6 ответов — с 1 по 6 (всего 6)
  • Тема «помогите с регуляркой» закрыта для новых ответов.