2012-01-22 2 views
0

Я видел много ответов, когда люди спрашивают, как захватить и извлечь фактические URL-адреса изображений, из содержимого веб-страницы/текста, однако, в моей базе данных, к сожалению, у меня есть это синтаксис:php match pattern для получения изображений из текстового файла

<img class="photo" src="http://domain.com/image.jpg" alt="alt goes here" /> 

Таким образом, типичный способ $pattern = '/src=["|\']([^"|\']+)/is'; не работает в моем случае из-за тех, кто " ... пытались в течение нескольких часов, я должен делать что-то очень и очень неправильно ... Любой помощи очень признателен!

+0

Почему вы не первый 'str_replace' все это, а затем использовать регулярное выражение? –

+0

Потому что 'str_replace' небезопасно? ** Зачем даже писать HTML-декодер и парсер в PHP, когда PHP делает это только путем вызова правильной функции? ** – Christian

+0

@ChristianSciberras - Похоже, вы меня неправильно поняли: я сказал, что он должен [сначала запустить 'str_replace' на его строка] (http://codepad.org/QekMM6IG), а затем используйте его регулярное выражение! –

ответ

1

Не используйте регулярное выражение!

Используйте библиотеки XML/DOM, такие как Simple HTML DOM.

Кстати, регулярное выражение, которое вы ищете,

$pattern = '/src=(["\'])(.+)(?=\1)/i'; 

Test Case (дополнительно):

Вот это простая программа, чтобы проверить его. Очевидно, вам нужно сначала использовать htmlspecialchars_decode(), чтобы декодировать его из формата сущности.

$str = array(
    "<script type=\"text/javascript\" src=\"script.js\"></script>", 
    "<script type=\"text/javascript\" src='script.js'></script>", 
    '<script type="text/javascript" src="script.js"></script>', 
    '<script type="text/javascript" src=\'script.js\'></script>', 
); 
$pattern = '/src=(["\'])(.+)(?=\1)/i'; 

foreach($str as $s){ 
    preg_match($pattern, $s, $m); 
    echo $m[2], PHP_EOL; 
} 

Выход

script.js 
script.js 
script.js 
script.js 
+0

@mario я вижу, моя ошибка. Подумал, что это был еще один случай с поклонником регулярного выражения. – Christian

+0

Okie. Обновите вопрос в соответствии с OP. @mario. –

+0

Спасибо всем, ребята, я следил за вашим советом по htmlspecialchars_decode и, наконец, у меня есть правильные образы URL! 'if (preg_match ($ pattern2, htmlspecialchars_decode ($ ck ['post']), $ found_img))' – Andrew

0

Вы можете проверить Regex здесь:

http://gskinner.com/RegExr/

Что не работает?

+0

Прежде всего, двойные кавычки преобразуются в '"' так же, как и другие специальные символы, во-вторых, 'preg_match' * определенно не является решением здесь *. – Christian

+0

@ChristianSciberras, ладно, я не видел кодировку в исходном посте. Хороший ответ! – mowwwalker

2

Прежде всего, «обычный способ» - использовать парсер HTML/XML, а не регулярные выражения.

Во-вторых, что у вас есть HTML-код закодированы как HTML текст, который пахнет плохо по двум причинам:

  • это не HTML больше (почему закодировать его как HTML-текст, когда он на самом деле HTML код) ?
  • вы не должны кодировать HTML перед тем, как поместить его в БД, а скорее при написании его пользователю.

С помощью этих двух вопросов в сторону, то, что вам нужно сделать, это htmlspecialchars_decode() этот материал и передать его через HTML-парсер:

$stuff = '&lt;img class=&quot;photo&quot; src=&quot;http://domain.com/image.jpg&quot; alt=&quot;alt goes here&quot; /&gt;'; 
$code = htmlspecialchars_decode($stuff, ENT_QUOTES); 
$xml = simplexml_load_string($code); 

Это сказал мне это звучит, как взломать, чтобы исправить плохо написанный код. Но может быть веская причина, почему она там, в первую очередь.

+0

'«< класс IMG = " фото " SRC = " http://domain.com/image.jpg " альт = " альт идет здесь "/>»,' фиктивный пример, чтобы показать путь тысячи различных веб-адресов найдены в моей базе данных. Моя проблема состоит в том, чтобы ИЗОЛИРОВАТЬ фактическое местоположение изображений каждый раз – Andrew

+0

@Andrew. Я хотел сказать, что материал, который у вас есть в вашей базе данных, выполнен неправильно. Во-первых, вы не кодируете HTML в текст HTML, во-вторых, база данных лучше всего работает, когда материал делится на столбцы и таблицы, а не на блок данных. Вы можете использовать мой код, чтобы делать все, что хотите. – Christian

+0

Спасибо всем за советы, @Christian Sciberras благодарю вас, его не мой код, я не гуру, просто новичок, пытающийся исправить что-то купленное, которое не работает должным образом ... Blame Invision IPB для этого типа содержимого db , все это происходит, когда авторизованные пользователи публикуют html (где разрешено публиковать html прямо в сообщении). У меня такая ситуация в моих руках, что-то вроде этого, и не могу изменить ее. Должен иметь дело с ним и найти регулярное выражение, которое распознает URL-адреса изображений :) – Andrew

Смежные вопросы