Я пытаюсь изменить функцию ниже, чтобы она возвращала 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;
}
И дальнейшее объяснение правильного регулярного выражения будет очень цениться 🙂
Заранее спасибо!
$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
Используйте это выражение:
~<img.+?src=['"]http://www\.domain\.com/([^'"]+)['"].*?>~i
Я буквально подобрал http://www.domain.com
за пределами вашей первой группы захвата вы ссылаетесь. Обратите внимание, что я изменил разделители на ~
поэтому нам не нужно избегать косых черт. Вы можете изменить это на https?://(?:www\.)?
чтобы сделать вещи более гибкими. Не забывайте избегать периодов. Кроме того, я сделал ваши повторения в формате dot-match-all ленивыми, чтобы избавить вас от головной боли в будущем (.+?
а также .*?
).
<img.+?https?://[^\/]+\/\K[^\"']+