Preg_replace_all ссылки на формат markdown

#php #markdown

#php #markdown

Вопрос:

Мы конвертируем в markdown, прежде чем мы использовали «внутреннюю» систему, где ссылки на изображение и все данные с ним (например, alt) заключены в другую скобку.

Например {IMAGE LINK}[OPTIONAL ALT WITH OTHER DATA]

Теперь мы переходим к markdown (наши данные хранятся в базе данных как markdown), мне нужно преобразовать все в markdown:

Итак, как я могу превратить все экземпляры {LINK}[OPTIONAL DATA] (квадратные скобки не требуются, поэтому некоторые просто {}) в эквивалент markdown:

В основном,

{http://www.youtube.com/image.gif}[this
is optional alt]
В ![alt](http://www.youtube.com/Image.gif)

Пока у меня есть следующее, но имею ли я дело с необязательным тегом [ALT DATA]?

    if (preg_match_all('/[(.*?)]/i', $string, $matches, PREG_SET_ORDER)) 
   {


   }
  

Ответ №1:

Для работы с необязательным атрибутом alt вам следует использовать preg_replace_callback. Это позволяет вам проверить наличие параметра alt attr и добавить его при необходимости.

 $str = '
This is an image {http://www.youtube.com/image.gif}[this is optional alt]
This is an image with an alt attribute {http://www.youtube.com/image.gif}
';

echo preg_replace_callback(
    '~{(http://[^s] )}(?:[(.*?)])?~',
    function($m){
        if ( isset( $m[2] ) ) {
            return $img = sprintf( '![%s](%s)', $m[2], $m[1] );
        }
        return $img = sprintf( '(%s)', $m[1] );
    },
    $str
);
  

Комментарии:

1. Вам не хватает! [] из второго возврата (это обязательно), но в остальном это правильно

2. @jonnie: я не пропустил ![] , этот оператор return предназначен для изображений с атрибутами alt

Ответ №2:

Простым случаем было бы

 {(.*?)}[(.*?)]   <-- search pattern
![1](2)           <-- replace pattern
  

но вы будете сбиты с толку ссылками, которые содержат экранированные символы ( { , } , [ , ] , ,,). Это потребовало бы предварительного просмотра, который вам придется надеяться, что кто-то другой напишет за вас. Однако, если это просто URL-адреса изображений, у вас не должно быть слишком много (если таковые имеются) случаев, когда это происходит.

Ответ №3:

Я бы использовал preg_replace_callback для этой цели. Там проще искать необязательный тег alt и / или создавать замену.

  $source = preg_replace_callback('#
        {  (http://[^}s] )  }  
        (?:                        
          [ ([^]{}n] ) ]        
        )?
     #x',
     "cb_img_markdown",
     $source);

 function cb_img_markdown($m) {
     list($asis, $link, $alt) = $m;
     if (!strlen($alt)) {
         $alt = "image " . basename($link);
     }
     return "![$alt]($link)";
 }
  

Вы также могли бы сделать соответствие ссылок более строгим, чтобы избежать ложных срабатываний. Здесь я просто сделал это зависящим от http:// присутствия, но вы могли бы добавить, например, (?:png|jpe?g|gif) , чтобы убедиться, что оно соответствует только URL-адресам изображений.

Комментарии:

1. Я отредактировал ответ, чтобы показать, что Markdown использует для соответствия! [alt](ссылка)

2. Вы скопировали неправильную часть. Встроенная обработка изображений — это регулярное выражение, расположенное ниже этого.

3. Хорошо, я удалил it…no интересно, что я неправильно понял, спасибо!

Ответ №4:

Это так сложно для разбора тегов в PHP, я бы посоветовал вам использовать этот PHP Simple HTML DOM Parser

очень легко анализировать теги любого типа, и вы также можете легко фильтровать по атрибутам.