Использование preg_match_all для возврата части URL изображения в WordPress

Я пытаюсь изменить функцию ниже, чтобы она возвращала URL-адрес первого сообщения без http://, URL домена и обратная косая черта в конце, но я действительно не знаю, как бороться с регулярным выражением в этом случае. Кстати, я работаю в WordPress.

Вот что возвращает функция:
http://www.domain.com/wp-content/uploads/2014/09/image.jpg

Это то, что мне нужно:
wp-content/uploads/2014/09/image.jpg

function catch_first_image()
{
global $post, $posts;
$first_img = '';
ob_start();
ob_end_clean();
$output = preg_match_all( '/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches );
$first_img = $matches[1][0];

echo $first_img;
}

И дальнейшее объяснение правильного регулярного выражения будет очень цениться 🙂
Заранее спасибо!

2

Решение

Живая демо

$output = preg_match_all( "/<img.*https?:\/\/[^\/]+\/([^\"']+)[\"'].*/i", $post->post_content, $matches );

echo $matches[1][0];

Объяснение:

.* => any character zero or more times
https? => http or https
[^\/]+ => any character other than / at least one time
[\"'] => double or single quote
2

Другие решения

Используйте это выражение:

~<img.+?src=['"]http://www\.domain\.com/([^'"]+)['"].*?>~i

демонстрация

Я буквально подобрал http://www.domain.com за пределами вашей первой группы захвата вы ссылаетесь. Обратите внимание, что я изменил разделители на ~ поэтому нам не нужно избегать косых черт. Вы можете изменить это на https?://(?:www\.)? чтобы сделать вещи более гибкими. Не забывайте избегать периодов. Кроме того, я сделал ваши повторения в формате dot-match-all ленивыми, чтобы избавить вас от головной боли в будущем (.+? а также .*?).

0

<img.+?https?://[^\/]+\/\K[^\"']+

демонстрация

0
По вопросам рекламы [email protected]