#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
очень легко анализировать теги любого типа, и вы также можете легко фильтровать по атрибутам.