2014-07-07 2 views
0

Я знаю, что есть другие темы, но у большинства из них есть разные проблемы. Я пытаюсь соответствовать URL изображений внутри обычного текста и конвертировать их в теги, но регулярное выражение не работает правильноregex для преобразования простого изображения url в img tags

/(http|https):\/\/(\S*)\.(jpg|gif|png)(\?(\S*))?/i

выше должно соответствовать изображение с URL-адрес строки:

http://www.example.com/landscape.jpg?w=120

и без строки запроса:

http://www.example.com/landscape.jpg

, но он не должен соответствовать этой, уведомлению Х в конце:

http://www.example.com/landscape.jpgx

, что не является URL образа и мое текущее регулярным выражение совпадает, как я могу настроить regext НЕ чтобы соответствовать этому последнему URL-адресу?

ответ

1

Вы можете добавить lookahead в конце, который проверяет следующий символ после URL (здесь, а символ пробела, конец строки или знак препинания):

~https?://\S+\.(?:jpe?g|gif|png)(?:\?\S*)?(?=\s|$|\pP)~i 
+0

Кажется работать, спасибо, это был мой последний PHP-код, мне нужно было заставить http в моем случае: '$ text = preg_replace ('/ (http | https): \/\/(\ S *) \. (Jpg | gif | png) (\? (\ S *))? (? = \ S | $ | \ pP)/i ',' ', $ текст, 1); – adrianTNT

0

Попробуйте это:

'/^https?\:\/\/\S+\.(jpg|gif|png)(\?\S+\=\S+)?$/i' 
+0

Возможно, вы захотите добавить 'jpeg' и другие распознанные расширения файлов для изображений. – PHPglue

+0

Спасибо, но правило, похоже, не работает, строка запроса должна быть необязательной, я думаю, что в вашем правиле «требуется». – adrianTNT

+0

'(\? \ S + \ = \ S +)?' Должно быть необязательным. – PHPglue

0

Попробуйте это ...

$string = 'This is image inside text string http://localhost/test/something.jpg?xml=10, http://google.com/logo.png'; 
function _callback($matches){ 
return '<img src="'.$matches[0].'" />' 
} 

echo preg_replace_callback('/https?:\/\/(.*?)\.(jpg|png|gif)(\?\w+=\w+)?/i', '_callback', $string); 
Смежные вопросы